我想知道为什么MS SQL Server查询规划器会创建嵌套循环,而不是为具有OR条件的JOIN选择Union。
注意:从SO上搜索,似乎不是MSSQL特定的
E.g。
SELECT * FROM TableA a
JOIN TableB b
ON a.One = b.One
OR a.Two = b.Two
在我的情况下花了6分钟(两个表都有两个索引)
但是
SELECT * FROM TableA a
JOIN TableB b
ON a.One = b.One
UNION -- Not ALL, as need to remove duplicates
SELECT * FROM TableA a
JOIN TableB b
ON a.Two = b.Two
需要2秒钟。
我知道第一个花费这么久的原因(因为嵌套循环,2个联合使用索引),但我想知道为什么查询规划器不选择UNION作为执行计划?
在使用不使用它的UNION时,是否需要注意某些警告?
为什么这个逻辑没有实现到查询规划器中?
仅仅是为了让查询规划器的代码更简单(因为它可能已经非常复杂了),他们还没有完成优化,或者还有其他一些我不知道的警告?
答案 0 :(得分:0)
这是一个选择性问题吗? SQL Server喜欢索引具有高度选择性。一个谓词总是被认为比两个谓词OR'd更具选择性,你的情况的差异可能是使用索引之间的差异。
请参阅Bart Duncan的SQL Weblog Query Tuning Fundamentals: Density, Predicates, Selectivity, and Cardinality,了解有关选择性的详细说明。