在一些 SQL Server 开发人员中,人们普遍认为NOT IN
速度非常慢,应该重写查询,以便返回相同的结果但不使用“evil”关键字。(例子)。
这有什么道理吗?
例如,SQL Server 中是否存在某些已知错误(哪个版本?)导致查询使用NOT IN
的执行计划比使用的等效查询更差
- 结合检查
LEFT JOIN
或NULL
(SELECT COUNT(*) ...) = 0
在WHERE
条款中?
在一些 SQL Server 开发人员中,人们普遍认为NOT IN
速度非常慢,应该重写查询,以便返回相同的结果但不使用“evil”关键字。(例子)。
这有什么道理吗?
例如,SQL Server 中是否存在某些已知错误(哪个版本?)导致查询使用NOT IN
的执行计划比使用的等效查询更差
LEFT JOIN
或NULL
(SELECT COUNT(*) ...) = 0
在WHERE
条款中?
我认为这与非常慢没有任何关系;它与潜在的不准确有关。例如,给定以下数据 - 可以由个人客户或 B2B 合作伙伴下达的订单:
假设我想找到所有从未下过订单的客户。根据数据,只有一个:客户 #2。以下是我编写查询以查找该信息的三种方法(还有其他方法):
结果:
现在,还有一些性能问题,我在这篇博文中讨论了这些问题。根据数据和索引,
NOT EXISTS
通常会跑赢NOT IN
,而且我不知道它是否会表现得更差。您还应该注意,EXCEPT
可以引入不同的排序操作,因此您最终可能会得到不同的数据(同样,取决于来源)。而且流行的LEFT OUTER JOIN ... WHERE right.column IS NULL
模式总是表现最差的。Martin Smith 在他关于 SO 的回答中也有很多很好的支持信息。