簡體   English   中英

為什么不使用SQL Server索引?

[英]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%成本Field150% RID Lookup (堆)的Table1

為什么不使用索引REC_ID

對於此查詢:

select *
from Table1
where Field1 = 'ABC' and rec_id <> 'D';

最好的索引是table1(Field1, rec_id)

但是,您的查詢可能無法利用索引。 where子句中使用索引的目的是減少需要讀取的頁面數。 要了解普通行上非聚集索引的概念,您需要一些基本的想法:

  • 記錄存儲在頁面上。
  • 每頁為8,192字節(用於數據的字節數略少),並且可以存儲一定數量的記錄。
  • 整個頁面被加載到內存中以讀取記錄。

假設一條記錄約為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM