我有三个表:SQL查询执行快捷方式或逻辑?
SmallTable
(id int, flag1 bit, flag2 bit)
JoinTable
(SmallTableID int, BigTableID int)
BigTable
(id int, text1 nvarchar(100), otherstuff...)
SmallTable
有,顶多几十记录。 BigTable
已经有几百万了,实际上是UNION在这个数据库中的一张表,在同一台服务器上的另一个数据库中有一张表。
这里的加入逻辑:
SELECT * FROM
SmallTable s
INNER JOIN JoinTable j ON j.SmallTableID = s.ID
INNER JOIN BigTable b ON b.ID = j.BigTableID
WHERE
(s.flag1=1 OR b.text1 NOT LIKE 'pattern1%')
AND (s.flag2=1 OR b.text1 <> 'value1')
平均加入尺寸为几千元的结果。显示的所有内容都被索引。
对于大多数SmallTable
记录,flag1
和flag2
设置为1
,所以真的没有必要,甚至访问BigTable.text1索引,但SQL Server不无论如何,导致代价高昂的索引扫描和嵌套循环。
有没有更好的方式来暗示到SQL Server,如果flag1
和flag2
都被设置为1
,它应该甚至懒得看text1
?
其实,如果我可以在这些情况下完全避免与BigTable的连接(JoinTable被管理,所以这不会产生问题),这将使这个关键查询更快。
+1有趣的问题。希望能够从这里学到更多! – AdaTheDev 2010-01-25 21:50:11
你提到了一个关于'BigTable'的索引扫描,这是一个视图。它是索引视图还是索引扫描在基础表上执行?你可以在这里发布查询计划吗? – Quassnoi 2010-01-27 17:03:41