在 where 子句中使用不等式 (<>) 或 NOT 是否会导致 SQL 忽略索引?

tsv*_*nav 2 index sql-server where

我发现这篇文章谈到避免在 where 子句中使用 <> 运算符,因为优化器会忽略索引。

https://www.mssqltips.com/sqlservertutorial/3203/avoid-using-not-equal-in-where-clause/

这绝对是真的吗?

处理这个问题的最佳方法是什么?如何避免使用 <> ?

Mar*_*ith 12

一个<> X谓语可优化搜索。

SQL Server 可以将其转换为两个范围搜索(on< X> X)。

除非索引覆盖查询,否则您可能看不到这一点。使用非覆盖索引和查找的查询的临界点通常非常低。(最多只有个位数百分比的选择性)。

因此,除非表的 99%确实具有值X<>否则将为要选择的计划匹配太多行。

即使在这种情况下,您也可能应该考虑只包含 1% 不匹配行的过滤索引,X而不是包含高度非选择性值的完整索引。

除非可能值的域是完全固定的并且非常小,否则您实际上无法选择使用<> X或编写它IN(all,values,that,are,not_x)- 您需要为所有可能的值选择具有正确语义的域。