【问题标题】:Sql server index usage depending on column valueSql server 索引使用取决于列值
【发布时间】:2018-05-15 11:25:48
【问题描述】:

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

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

例如。简单地运行:

select * from LargeNumberOfItemsTable where typeid=4

让 SQL Server 使用索引,但是

select * from LargeNumberOfItemsTable where typeid=3

不使用索引。

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

奇怪的是统计已经更新,索引已经重建。

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

【问题讨论】:

  • 您更新了统计数据吗?
  • 是的,统计信息已更新。
  • 包含两个查询的实际执行计划,使用此链接 (brentozar.com/pastetheplan) 并包含在问题中
  • 可以分享一下执行计划吗?
  • 使用“MAXDOP 1”选项重建解决了问题

标签: sql-server performance database-indexes


【解决方案1】:

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

确保使用 MAXDOP 1 重建索引。否则,无序扩展区将削弱预读扫描的好处,导致在未缓存数据时执行扫描的计划更差。

【讨论】:

  • 谢谢!就是这样:D
  • 如何确定索引何时会受益于使用MAXDOP 1的重建
  • @Mazhar,使用 MAXDOP 1 进行重建非常适合进行大量扫描的工作负载。但是,这将增加重建时间。也可以使用重组而不是重建,它本质上是单线程和在线的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多