为什么UNION比OR语句更快

时间:2013-03-12 13:00:35

标签: sql sql-server union

我有一个问题,我需要找到一个测量值匹配值的记录,根本没有测量值。我使用JOIN,使用NOT IN并使用NOT EXISTS,使用三种或四种不同的方法解决了这个问题。但是,查询最终每次都非常慢。然后我尝试将查询分成两部分,它们都运行得非常快(三秒钟)。但是使用OR组合查询需要五分钟以上。

阅读SO我尝试了UNION,这非常快,但对我正在使用的脚本非常不方便。

所以有两个问题:

  1. 为什么UNION这么快? (或者为什么OR这么慢?)
  2. 有什么方法可以强制MSSQL对快速的OR语句使用不同的方法吗?

2 个答案:

答案 0 :(得分:9)

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

此外,如果您想要所有结果,通常最好使用UNION ALL而非UNION,因为您删除了行匹配的费用。

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