2

我想知道为什么 MS SQL Server Query Planner 创建嵌套循环而不是为带有 OR 条件的 JOIN 选择联合。

注意:通过搜索 SO,似乎不是特定于 MSSQL

例如

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 时,我需要注意一些警告吗?

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

是否只是为了让查询计划器的代码更简单(因为它可能已经很复杂了),他们还没有优化的东西,或者因为还有其他一些我不知道的警告?

4

1 回答 1

0

Is this a selectivity issue? SQL Server likes indexes to be highly selective. One predicate will always be considered more selective than two predicates OR'd and the difference in your case may be the difference between using the indexes or not.

See Bart Duncan's SQL Weblog Query Tuning Fundamentals: Density, Predicates, Selectivity, and Cardinality for a lengthy writeup on selectivity.

于 2015-02-24T22:47:43.930 回答