我有一个问题,我需要找到一个测量值匹配值的记录,或根本没有测量值。我使用JOIN
,使用NOT IN
并使用NOT EXISTS
,使用三种或四种不同的方法解决了这个问题。但是,查询最终每次都非常慢。然后我尝试将查询分成两部分,它们都运行得非常快(三秒钟)。但是使用OR
组合查询需要五分钟以上。
阅读SO我尝试了UNION
,这非常快,但对我正在使用的脚本非常不方便。
所以有两个问题:
UNION
这么快? (或者为什么OR
这么慢?)MSSQL
对快速的OR
语句使用不同的方法吗?答案 0 :(得分:9)
原因是在查询中使用OR
通常会导致查询优化器放弃使用索引搜索并恢复扫描。如果您查看两个查询的执行计划,您很可能会看到使用OR
的扫描位置并查找您使用UNION
的位置。在没有看到您的查询的情况下,您无法就如何重组OR
条件给出任何想法。但是您可能会发现将行插入临时表并连接到它可能会产生积极的结果。
此外,如果您想要所有结果,通常最好使用UNION ALL
而非UNION
,因为您删除了行匹配的费用。
答案 1 :(得分:6)
如果没有使用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必须过滤掉重复的行,这在大多数情况下需要昂贵的排序操作。