缺失索引 dmv 计数每天都在变化

Mag*_*ier 3 sql-server-2008-r2 dmv index-tuning

我对 Missig 索引 dmv 有疑问。

BOL 说

sys.dm_db_missing_index_details 返回的信息在查询优化器优化查询时更新,不会持久化。丢失的索引信息只会保留到重新启动 SQL Server。数据库管理员如果想在服务器回收后保留丢失的索引信息,应该定期备份。

我基本上使用以下(稍微简化的)查询来做到这一点:

SELECT <SomeFieldsAndCalculations> FROM sys.dm_db_missing_index_details AS d
INNER JOIN sys.dm_db_missing_index_groups AS g ON d.index_handle = g.index_handle
INNER JOIN sys.dm_db_missing_index_group_stats AS s ON g.index_group_handle = s.group_handle
INNER JOIN Database1.sys.objects o on d.[object_id] = o.[object_id]
INNER JOIN Database1.sys.schemas sch on sch.[schema_id] = o.[schema_id]
Run Code Online (Sandbox Code Playgroud)

结果每天从 10 个 sql 服务器写入一个表(具有正确的分组选项...)。

查看此表,我发现缺失索引的数量变化很大。这些是一行中缺失索引的总数(在多个实例上):

3091 3133 3090 3135 3131 2506 2750 2028 2032 2195 2274 2269 2272 2373

服务尚未重新启动。

从 BOL 的介绍中,我可以理解一天到一天的细微变化。假设一天出现的缺失索引应该仍然在第二天的 dmv 中,总计数怎么会变化那么大?例如在 24 小时内从 3131 减少到 2506?这是每个实例大约 60 的变化......与从 2272 到 2373 的增加数字相同 - 在 24 小时内每个实例突然丢失了 10 个额外的索引......?

在此期间未创建任何索引。但是在此期间未使用的索引已被删除。我看不到删除未使用和丢失的索引之间的关系......

问题

  • 如果 Sql Service 不间断运行,上述查询返回缺失的索引信息需要多长时间?

  • 什么会影响缺失索引的数量?

Bob*_*mes 6

如果引用的表已更改,将从视图中清除缺少的索引信息。添加列,新索引会清除这些数据。当您删除索引时,该表的任何丢失的索引信息也将被删除。

索引重建也会清除此信息,因此如果您在夜间进行索引维护,这可能会导致数字发生变化。(编辑:重建仅清除 2012+ 上丢失的索引信息)

  • 我在 2014 年的实例中进行了索引重建的原始测试,其中在重建后删除了丢失的索引信息(reorg 不删除信息)。在 2008R2 中,索引重建不会删除丢失的索引信息。 (3认同)