[英]Why SQL Server index is not used?
我的大多數SQL查詢都具有WHERE rec_id <> 'D';
例如:
select * from Table1 where Field1 = 'ABC' and rec_id <> 'D'
我在REC_ID
上添加了索引。 但是,當我運行此查詢並查看執行計划時,未使用新索引(REC_ID)
。 執行計划顯示的非聚簇索引的50%成本Field1
和50% RID Lookup
(堆)的Table1
。
為什么不使用索引REC_ID
?
對於此查詢:
select *
from Table1
where Field1 = 'ABC' and rec_id <> 'D';
最好的索引是table1(Field1, rec_id)
。
但是,您的查詢可能無法利用索引。 在where
子句中使用索引的目的是減少需要讀取的頁面數。 要了解普通行上非聚集索引的概念,您需要一些基本的想法:
假設一條記錄約為80個字節,並且每頁上有100條記錄。 如果10%的記錄具有Field1 = 'ABC'
,則每頁上將有大約十個記錄。 這意味着使用索引不會(通常)保存任何頁面讀取。 如果有1%的記錄匹配,則每頁大約有一個。 索引仍然沒有幫助。
如果只有0.01%的記錄匹配(在您的情況下為30),則僅需要讀取一部分頁面。 這是索引的最佳選擇,並且在它們真正有用的地方。
匹配記錄的數量稱為“選擇性”。 如果where
子句不是非常有選擇性,那么非聚集索引將無用。
有時,聚集索引在這種情況下可能會有所幫助。 但是,聚簇索引可能具有更多的insert
和某些update
事務開銷。 因此,索引的選擇需要基於正在處理的查詢以及使用該表的其他方式。
SQL Server使用許多因素來決定要使用的索引。 必須確定使用Field1
的索引比使用rec_id
上的索引更有效-意味着基於數據分散等, field1={value}
定義的集合比rec_id <> {value}
小,因此,與其他條件進行比較的記錄較少。 注意,實際值通常與確定使用哪個索引無關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.