为什么 UNION 比 OR 语句更快[重复]

问题描述 投票:0回答:2

我遇到一个问题,我需要查找具有与某个值匹配的测量值的记录,根本没有该测量值。我用三到四种不同的方法解决了这个问题,使用

JOIN
、使用
NOT IN
和使用
NOT EXISTS
。然而,每次查询最终都变得非常慢。然后我尝试将查询分成两部分,它们都运行得非常快(三秒)。但使用
OR
组合查询需要超过五分钟。

继续阅读,我尝试了

UNION
,速度非常快,但对于我正在使用的脚本来说非常不方便。

那么两个问题:

  1. 为什么
    UNION
    这么快? (或者为什么
    OR
    这么慢)?
  2. 有什么方法可以强制 SQL Server 对快速的
    OR
    语句使用不同的方法吗?
sql sql-server union
2个回答
18
投票

原因是在查询中使用

OR
通常会导致查询优化器放弃使用索引查找并恢复到扫描。如果查看两个查询的执行计划,您很可能会看到使用
OR
的扫描,并查找使用
UNION
的位置。如果没有看到您的查询,就不可能为您提供有关如何重组
OR
条件的任何想法。但您可能会发现将行插入临时表并连接到它可能会产生积极的结果。

此外,如果您想要所有结果,通常最好使用

UNION ALL
而不是
UNION
,因为您可以消除行匹配的成本。


6
投票

如果没有使用

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 必须过滤掉重复的行,这在大多数情况下需要昂贵的排序操作。

© www.soinside.com 2019 - 2024. All rights reserved.