我想知道为什么 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 时,我需要注意一些警告吗?
为什么这个逻辑没有在查询计划器中实现?
是否只是为了让查询计划器的代码更简单(因为它可能已经很复杂了),他们还没有优化的东西,或者因为还有其他一些我不知道的警告?