Sql-Server
在 where 子句中使用不等式 (<>) 或 NOT 會導致 SQL 忽略索引嗎?
我發現這篇文章討論了避免在 where 子句中使用 <> 運算符,因為優化器忽略了索引。
https://www.mssqltips.com/sqlservertutorial/3203/avoid-using-not-equal-in-where-clause/
這絕對是真的嗎?
處理這個問題的最佳方法是什麼?如何避免使用 <> ?
<> X
謂詞是可搜尋的。SQL Server 可以將其轉換為兩個範圍搜尋(on
< X
或> X
)。除非索引涵蓋了查詢,否則您可能看不到這一點。使用非覆蓋索引和查找的查詢的臨界點通常非常低。(最多只有個位數百分比的選擇性)。
因此,除非 99% 的表確實具有值
X
,<>
否則將匹配太多行以供選擇該計劃。即使在這種情況下,您也可能應該考慮僅包含 1% 的不匹配行的過濾索引,
X
而不是包含高度非選擇性值的完整索引。除非可能值的域是完全固定的並且非常小,否則您實際上無法在使用
<> X
或編寫它之間IN(all,values,that,are,not_x)
做出選擇——您需要為所有可能值選擇具有正確語義的域。