[英]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.