为啥 UNION 比 OR 语句快 [重复]

Posted

技术标签:

【中文标题】为啥 UNION 比 OR 语句快 [重复]【英文标题】:Why is UNION faster than an OR statement [duplicate]为什么 UNION 比 OR 语句快 [重复] 【发布时间】:2013-03-12 13:00:35 【问题描述】:

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

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

那么两个问题:

    为什么UNION 这么快? (或者为什么OR 这么慢)? 有什么方法可以强制MSSQLOR 语句使用另一种快速的方法吗?

【问题讨论】:

你能告诉我们你所指的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 语句快 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句中:UNION与UNION ALL的区别

mysqldump 导出来.sql文件导入数据库的速度为啥比自己写的insert语句快

为啥PostgreSQL UUID-OSSP可能产生重复值

SQL语句中:UNION与UNION ALL的区别

SQL语句中:UNION与UNION ALL的区别

sql中union 和 union all的区别