繁体   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