【发布时间】:2011-01-09 06:55:00
【问题描述】:
我有三张桌子:
SmallTable
(id int, flag1 bit, flag2 bit)
JoinTable
(SmallTableID int, BigTableID int)
BigTable
(id int, text1 nvarchar(100), otherstuff...)
SmallTable 最多有几十条记录。 BigTable 有几百万,实际上是一个视图,将这个数据库中的一个表与同一服务器上另一个数据库中的一个表联合起来。
这是连接逻辑:
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 无论如何都会这样做,从而导致代价高昂的 Indexed扫描和嵌套循环。
有没有更好的方法来提示 SQL Server,如果 flag1 和 flag2 都设置为 1,它甚至不应该费心查看 text1?
实际上,如果我可以在这些情况下完全避免连接到 BigTable(JoinTable 是托管的,所以这不会造成问题),这将使这个键查询更快。
【问题讨论】:
-
+1 有趣的问题。希望自己能从中学到更多!
-
您提到了对
BigTable的索引扫描,这是一个视图。是索引视图,还是对基础表执行索引扫描?你能把查询计划贴在这里吗?
标签: sql-server performance tsql sql-execution-plan short-circuiting