为啥 UNION 比 OR 语句快 [重复]
Posted
技术标签:
【中文标题】为啥 UNION 比 OR 语句快 [重复]【英文标题】:Why is UNION faster than an OR statement [duplicate]为什么 UNION 比 OR 语句快 [重复] 【发布时间】:2013-03-12 13:00:35 【问题描述】:我有一个问题,我需要查找具有与值匹配的度量的记录,或根本没有该度量。我用三种或四种不同的方法解决了这个问题,使用JOIN
s、使用NOT IN
和使用NOT EXISTS
。但是,查询最终每次都非常慢。然后我尝试将查询一分为二,它们都运行得非常快(三秒)。但是使用OR
组合查询需要五分钟以上。
阅读所以我尝试了UNION
,这非常快,但对于我正在使用的脚本来说非常不方便。
那么两个问题:
-
为什么
UNION
这么快? (或者为什么OR
这么慢)?
有什么方法可以强制MSSQL
对OR
语句使用另一种快速的方法吗?
【问题讨论】:
你能告诉我们你所指的sql吗? 也许向我们展示您尝试过的完整陈述? 我希望我们可以不用,因为我需要重命名所有字段和表。这真的特定于我的查询吗?根据我在 Google 上的发现,这是一个很常见的问题。 @occulus 我怎么没找到?? 你不需要重命名所有的列,但是如果你有一个特定的问题,你需要创建一个 SQL fiddle。没有这些信息,对社区或您自己没有任何好处。我们对您的架构(索引等)一无所知 【参考方案1】:原因是在查询中使用OR
通常会导致查询优化器放弃使用索引查找并恢复为扫描。如果您查看两个查询的执行计划,您很可能会看到使用OR
的扫描并寻找您使用UNION
的位置。在没有看到您的查询的情况下,实际上不可能为您提供有关如何重组 OR
条件的任何想法。但您可能会发现将行插入临时表并加入其中可能会产生积极的结果。
此外,如果您想要所有结果,通常最好使用UNION ALL
而不是UNION
,因为您消除了行匹配的成本。
【讨论】:
我不能欺骗它使用 OR 进行索引扫描? @saratis - 你也许可以,但如果没有看到你的 SQL,我不能给你一个肯定的答案,真的。 感谢一百万,Matt 的解释。还要感谢马特的问题。在 ORACLE 服务器上查询时遇到了类似的问题,这对我很有帮助。【参考方案2】:如果没有使用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 必须过滤掉重复的行,这在大多数情况下需要昂贵的排序操作。
【讨论】:
以上是关于为啥 UNION 比 OR 语句快 [重复]的主要内容,如果未能解决你的问题,请参考以下文章