Sql 服务器索引使用情况取决于列值

Sql server index usage depending on column value

我有一个巨大的 table(它有超过 4000 万条记录)和一个列的索引。该列是参考列 - typeId。

我 运行 遇到一个问题,即在使用不同的列值过滤该列上的数据时,有时会使用索引,有时不会。

例如。只需 运行ning:

select * from LargeNumberOfItemsTable where typeid=4

使 SQL 服务器使用索引,但

select * from LargeNumberOfItemsTable where typeid=3

不使用索引。

不使用索引时,查询需要很长时间,但是当我强制提示应该使用索引时,只需几秒钟即可运行。

奇怪的是,更新了统计数据,重建了索引

有没有人知道为什么会发生这种行为?我正在寻找一些提示,在哪里可以找到原因。

SQL 服务器根据估计的行数选择计划。如果估计的行数是准确的,则完整 table 扫描与查找和键查找所花费的时间将在很大程度上取决于您的硬件和可用资源。

确保使用 MAXDOP 1 重建索引。否则,乱序的区段将削弱预读扫描的优势,导致扫描计划在数据未缓存时执行得更差。