我遇到一个问题,我需要查找具有与某个值匹配的测量值的记录,或根本没有该测量值。我用三到四种不同的方法解决了这个问题,使用
JOIN
、使用 NOT IN
和使用 NOT EXISTS
。然而,每次查询最终都变得非常慢。然后我尝试将查询分成两部分,它们都运行得非常快(三秒)。但使用 OR
组合查询需要超过五分钟。
继续阅读,我尝试了
UNION
,速度非常快,但对于我正在使用的脚本来说非常不方便。
那么两个问题:
UNION
这么快? (或者为什么OR
这么慢)?OR
语句使用不同的方法吗?原因是在查询中使用
OR
通常会导致查询优化器放弃使用索引查找并恢复到扫描。如果查看两个查询的执行计划,您很可能会看到使用 OR
的扫描,并查找使用 UNION
的位置。如果没有看到您的查询,就不可能为您提供有关如何重组 OR
条件的任何想法。但您可能会发现将行插入临时表并连接到它可能会产生积极的结果。
此外,如果您想要所有结果,通常最好使用
UNION ALL
而不是 UNION
,因为您可以消除行匹配的成本。
如果没有使用
UNION
语句,目前 SQL Server 中无法强制执行 UNION
执行计划。如果两个部分之间的唯一区别是 WHERE
子句,请使用复杂查询创建一个视图。然后 UNION
查询变得非常简单:
SELECT * FROM dbo.MyView WHERE <cond1>
UNION ALL
SELECT * FROM dbo.MyView WHERE <cond2>
尽可能在这种情况下使用
UNION ALL
非常重要。如果您只是使用 UNION
SQL Server 必须过滤掉重复的行,这在大多数情况下需要昂贵的排序操作。