使用OR加入 - 查询计划程序选择嵌套循环

时间:2015-02-24 22:26:06

标签: sql sql-server rdbms query-planner

我想知道为什么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时,是否需要注意某些警告?

为什么这个逻辑没有实现到查询规划器中?

仅仅是为了让查询规划器的代码更简单(因为它可能已经非常复杂了),他们还没有完成优化,或者还有其他一些我不知道的警告?

1 个答案:

答案 0 :(得分:0)

这是一个选择性问题吗? SQL Server喜欢索引具有高度选择性。一个谓词总是被认为比两个谓词OR'd更具选择性,你的情况的差异可能是使用索引之间的差异。

请参阅Bart Duncan的SQL Weblog Query Tuning Fundamentals: Density, Predicates, Selectivity, and Cardinality,了解有关选择性的详细说明。