首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么UNION比OR语句更快

问为什么UNION比OR语句更快
EN

Stack Overflow用户
提问于 2013-03-12 13:00:35
回答 2查看 17.4K关注 0票数 11

我遇到了一个问题,我需要找到要么具有与值匹配的度量的记录,要么或根本没有该度量。我用三、四种不同的方法解决了这个问题,使用JOIN、NOT IN和NOT EXISTS。但是,每次查询的速度都非常慢。然后,我尝试将查询分成两部分,它们都运行得非常快(3秒)。但是使用OR组合查询需要超过5分钟。

继续阅读,所以我尝试了UNION,它非常快,但对我正在使用的脚本非常不方便。

所以有两个问题:

  1. 为什么UNION要快得多?(或者为什么OR这么慢)?
  2. 我是否可以强迫MSSQL对快速的OR语句使用另一种方法?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-12 13:09:07

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

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

票数 15
EN

Stack Overflow用户

发布于 2013-03-12 13:08:06

如果没有使用UNION语句,Server目前无法强制执行UNION执行计划。如果这两个部分之间唯一的区别是WHERE子句,那么使用复杂的查询创建一个视图。然后,UNION查询变得非常简单:

代码语言:javascript
复制
SELECT * FROM dbo.MyView WHERE <cond1>
UNION ALL
SELECT * FROM dbo.MyView WHERE <cond2>

如果可能的话,在这个上下文中使用UNION ALL是很重要的。如果您只使用UNION,Server必须筛选出重复的行,这在大多数情况下需要昂贵的排序操作。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15361972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档