我遇到了一个问题,我需要找到要么具有与值匹配的度量的记录,要么或根本没有该度量。我用三、四种不同的方法解决了这个问题,使用JOIN、NOT IN和NOT EXISTS。但是,每次查询的速度都非常慢。然后,我尝试将查询分成两部分,它们都运行得非常快(3秒)。但是使用OR组合查询需要超过5分钟。
继续阅读,所以我尝试了UNION,它非常快,但对我正在使用的脚本非常不方便。
所以有两个问题:
UNION要快得多?(或者为什么OR这么慢)?MSSQL对快速的OR语句使用另一种方法?发布于 2013-03-12 13:09:07
原因是在查询中使用OR通常会导致查询优化器放弃使用索引、查找和恢复到扫描。如果您查看两个查询的执行计划,您很可能会看到正在使用OR的位置进行扫描,并查找使用UNION的位置。如果没有看到您的查询,就不可能给您任何关于如何重构OR条件的想法。但您可能会发现,将行插入临时表并将其连接到表中可能会产生积极的结果。
此外,如果您想要所有的结果,通常最好使用UNION ALL而不是UNION,因为您删除了行匹配的成本。
发布于 2013-03-12 13:08:06
如果没有使用UNION语句,Server目前无法强制执行UNION执行计划。如果这两个部分之间唯一的区别是WHERE子句,那么使用复杂的查询创建一个视图。然后,UNION查询变得非常简单:
SELECT * FROM dbo.MyView WHERE <cond1>
UNION ALL
SELECT * FROM dbo.MyView WHERE <cond2>如果可能的话,在这个上下文中使用UNION ALL是很重要的。如果您只使用UNION,Server必须筛选出重复的行,这在大多数情况下需要昂贵的排序操作。
https://stackoverflow.com/questions/15361972
复制相似问题