我有一个巨大的表(它有超过40万条记录)和一个列的索引。该列是参考列 - typeId。
我遇到了一个问题,即在使用不同的列值过滤该列上的数据时,有时会使用索引,有时则不会。
EG。只是跑步:
SELECT field1 FROM table1 WHERE field1='Jiri Červeny' collate utf8_czech_ci;
| field1 |
|--------------|
| Jiri Červeny |
使SQL Server使用索引,但
select * from LargeNumberOfItemsTable where typeid=4
不使用索引。
当没有使用索引时,查询需要很长时间,但是当我强制提示应该使用索引时,运行它只需几秒钟。
奇怪的是,统计数据已经更新,索引已经重建。
有没有人有想法,为什么会出现这种行为?我正在寻找一些提示,寻找原因。
答案 0 :(得分:3)
SQL Server根据估计的行数选择计划。如果估计的行数是准确的,则全表扫描与搜索和密钥查找所花费的时间在很大程度上取决于您的硬件和可用资源。
确保使用MAXDOP 1重建索引。否则,无序扩展区将降低预读扫描的优势,导致扫描计划在未缓存数据时执行得更差。