与索引相关的 NOT 逻辑的使用

Stu*_*ler 13 index sql-server optimization

根据 Microsoft 的数据库开发书70-433:Microsoft SQL Server 2008 数据库开发

前导通配符和NOT逻辑都不允许查询优化器使用索引来优化搜索。为了获得最佳性能,您应该避免使用NOT关键字和前导通配符。

所以我认为那是NOT INNOT EXISTS等等

现在关于这个SO问题,我认为@GBN 选择的解决方案会违反上面给出的声明。

显然,事实并非如此。

所以我的问题是:为什么?

gbn*_*gbn 22

  • NOT IN (SELECT ...)并且NOT EXISTS (SELECT .. WHERE correlation..)是“反半连接”。也就是说,公认的基于集合的操作

  • WHERE NOT (MyColumn = 1) 是需要查看所有行的过滤器

有关更多信息,请参阅:

编辑:为了完整性

LEFT JOIN 通常表现更差。见http://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server

同一个站点指出,在 MySQL 中,NOT EXISTS 不像其他 RDBMS 那样优化,LEFT JOIN 更好

在 SQL Server 中,我从经验中知道 LEFT JOIN 不像 NOT EXISTS 那样运行。您还经常需要 DISTINCT 来获得与另一个处理步骤相同的结果。