11

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

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

所以两个问题:

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

2 回答 2

14

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

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

于 2013-03-12T13:09:07.617 回答
5

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

SELECT * FROM dbo.MyView WHERE <cond1>
UNION ALL
SELECT * FROM dbo.MyView WHERE <cond2>

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

于 2013-03-12T13:08:06.840 回答