Sql 为什么联盟比OR声明更快

Sql 为什么联盟比OR声明更快,sql,sql-server,union,Sql,Sql Server,Union,我有一个问题,我需要找到的记录要么有一个与某个值匹配的度量值,要么根本没有该度量值。我用三到四种不同的方法解决了这个问题,使用连接、使用notin和使用notexists。然而,每次查询都非常慢。然后我尝试将查询一分为二,它们都运行得非常快,持续了三秒钟。但是使用OR组合查询需要五分钟以上 继续阅读,所以我尝试了UNION,它非常快,但对于我正在使用的脚本来说非常不方便 所以有两个问题: 为什么工会要快得多?或者为什么它会这么慢? 有没有什么方法可以强制MSSQL对OR语句使用不同的方法来快速执

我有一个问题,我需要找到的记录要么有一个与某个值匹配的度量值,要么根本没有该度量值。我用三到四种不同的方法解决了这个问题,使用连接、使用notin和使用notexists。然而,每次查询都非常慢。然后我尝试将查询一分为二,它们都运行得非常快,持续了三秒钟。但是使用OR组合查询需要五分钟以上

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

所以有两个问题:

为什么工会要快得多?或者为什么它会这么慢? 有没有什么方法可以强制MSSQL对OR语句使用不同的方法来快速执行?
如果未使用UNION语句,SQL Server当前无法强制执行UNION执行计划。如果这两部分之间的唯一区别是WHERE子句,请使用复杂查询创建一个视图。然后,UNION查询变得非常简单:

SELECT * FROM dbo.MyView WHERE <cond1>
UNION ALL
SELECT * FROM dbo.MyView WHERE <cond2>
在这种情况下,尽可能使用UNIONALL是很重要的。如果只使用UNION SQL Server,则必须过滤掉重复的行,这在大多数情况下需要昂贵的排序操作。

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


此外,如果您想要所有结果,通常最好使用UNION ALL而不是UNION,因为这样可以减少行匹配的成本。

您可以向我们展示您所指的sql吗?也许可以向我们展示您完整尝试过的语句?我希望我们可以不使用UNION ALL,因为我需要重命名所有字段和表。这真的是针对我的问题的吗?从我在谷歌上发现的情况来看,这是一个很常见的问题。@occulus我怎么没有发现??你不需要重命名所有的列,但是如果你有一个特定的问题,你需要创建一个SQL FIDLE。如果没有这些信息,对社区或你自己都没有好处。我们对您的模式索引一无所知,因此我无法使用OR?@saratis欺骗它使用索引扫描-您可能可以,但如果没有看到您的SQL,我无法给您一个确切的答案,真的。非常感谢Matt的解释。也谢谢马特的提问。在ORACLE服务器上的查询中遇到类似的问题,这对我帮助很大。