为什么UNION比OR语句更快

Der*_*rts 8 sql sql-server union

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

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

所以有两个问题:

  1. 为什么UNION这么快?(或者为什么OR这么慢)?
  2. 有什么方法可以强制MSSQL使用不同的方法来 OR快速发表声明吗?

Mat*_*eld 10

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

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

  • 我不能欺骗它使用 OR 进行索引扫描吗? (2认同)

Seb*_*ine 6

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

SELECT * FROM dbo.MyView WHERE <cond1>
UNION ALL
SELECT * FROM dbo.MyView WHERE <cond2>
Run Code Online (Sandbox Code Playgroud)

UNION ALL在可能的情况下,在这种情况下使用是很重要的.如果您只是使用UNIONSQL Server必须过滤掉重复的行,这在大多数情况下需要昂贵的排序操作.