Sql-Server

在 where 子句中使用不等式 (<>) 或 NOT 會導致 SQL 忽略索引嗎?

  • August 9, 2020

我發現這篇文章討論了避免在 where 子句中使用 <> 運算符,因為優化器忽略了索引。

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

這絕對是真的嗎?

處理這個問題的最佳方法是什麼?如何避免使用 <> ?

&lt;&gt; X謂詞是可搜尋的。

SQL Server 可以將其轉換為兩個範圍搜尋(on&lt; X&gt; X)。

除非索引涵蓋了查詢,否則您可能看不到這一點。使用非覆蓋索引和查找的查詢的臨界點通常非常低。(最多只有個位數百分比的選擇性)。

因此,除非 99% 的表確實具有值X&lt;&gt;否則將匹配太多行以供選擇該計劃。

即使在這種情況下,您也可能應該考慮僅包含 1% 的不匹配行的過濾索引,X而不是包含高度非選擇性值的完整索引。

除非可能值的域是完全固定的並且非常小,否則您實際上無法在使用&lt;&gt; X或編寫它之間IN(all,values,that,are,not_x)做出選擇——您需要為所有可能值選擇具有正確語義的域。

引用自:https://dba.stackexchange.com/questions/273082