【问题标题】:sys.dm_db_missing_index_details returns no rowssys.dm_db_missing_index_details 不返回任何行
【发布时间】:2011-03-29 02:38:25
【问题描述】:

我试图查看 sys.dm_db_missing_index_details 以检查我的 SQL Server 2005 数据库中是否存在缺失的索引。它没有返回任何行。

它可能应该是空的,但极不可能,因为我没有在任何表上添加任何索引(通过创建主键获得的索引除外)。我还在针对它运行单元测试以及临时开发测试(使用 Linq to SQL),因此有一些针对它的活动。

我是否需要开启对这些数据的捕获?

这仅在某些版本的 SQL Server 2005 上支持吗?

提前感谢您提供帮助。

【问题讨论】:

  • 你对数据库和服务器有什么权限?
  • 大家好。使用 sa 帐户尝试过此操作。还使用这个 sa 帐户运行了我的一系列自动化测试。

标签: sql-server sql-server-2008 sql-server-2005 dmv


【解决方案1】:

它似乎默认开启 - 尽管检查您用于启动的任何快捷方式并确保它没有使用-x 启动

来自http://msdn.microsoft.com/en-us/library/ms345524(v=SQL.90).aspx

只有在使用 sqlservr 命令提示实用程序的 -x 参数启动 SQL Server 实例时,才能禁用此功能。

您还想知道,如果 SQL Server 使用查询优化器,则在运行查询时会填充该表 - 此表在您重新启动 SQL Server 时会被清除

来自http://msdn.microsoft.com/en-us/library/ms345434(v=SQL.90).aspx

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

最后有一篇文章介绍了这里的限制,你可能知道也可能不知道,但我会发布以防其他人在这篇文章中遇到并需要:http://msdn.microsoft.com/en-us/library/ms345485(v=SQL.90).aspx

我没有看到某些版本中缺少该功能的任何信息,但您需要某些权限:

用户必须被授予 VIEW SERVER STATE 权限或任何暗示 VIEW SERVER STATE 权限的权限才能查询此动态管理视图。

【讨论】:

  • 嗨,DKnight。很棒的答案-非常彻底。不幸的是,我的 SQL 服务器看起来不像是用 -x 启动的。此外,我尝试将查询视为“sa”,但仍然什么也没看到,所以我怀疑在这种情况下这不是权限问题。关于我还能检查什么的任何建议?如果需要更多信息,很高兴发布系统查询的结果。
  • 我看到的唯一其他建议是确保您正在运行实际需要优化的查询。检查的方法是运行“显示估计的执行计划”并验证您是否有绿色的“缺少索引(影响......”。不确定这是否足以生成表条目,但运行该查询应该在那张桌子上放点东西
  • 另外,如果您连接到多个数据库服务器,请确认您检查的是正确的 - 我可以看到自己犯了这个错误
  • 嗨,DKnight。我将尝试执行计划建议。也感谢有关正确数据库的建议 - 最简单的建议有时是最有用的。
  • 检查的方法是运行“显示估计的执行计划”并验证您是否有绿色的“缺失索引(影响......”。嗯,看到一些绿色框虽然没有关于缺失索引的通知。也许这是一个线索,但不幸的是不是答案。感谢您的帮助@DKnight
【解决方案2】:

另一种选择是直接查询计划缓存——这还有一个好处是它可以为您提供需要索引的查询。有一个相关的问题here on SO——BankZ 的答案有一个完整的 SQL 脚本可以完成这项工作。

虽然它可能运行缓慢 - 计划是 XML 格式的,所以对于这个查询,我们要求 SQL Server 执行大量 XML 工作而不是表格工作。但它确实有效:-)

与缺少的主索引表一样,如果重新启动 SQL Server,计划缓存将被清除。

【讨论】:

  • 感谢您抽出宝贵时间回复克里斯。我运行了查询,它返回了 0 行,表明这里有一些更基本的东西。感谢您关于在重新启动时丢失计划缓存的说明 - 不是这种情况,但可以在此线程中记录。
  • 您缺少的“基本知识”可能只是 SQL 真的不认为它需要更多索引 :-) 您是否查看过执行查询的查询计划?此外,表中有多少行——可能是因为表中的行太少,以至于 SQL Server 认为额外的索引不会起到任何重要作用。
  • 嗨,克里斯,您可能是对的,但目前看来不太可能。我使用的数据表的范围从 100 到 2,000 行 - 在宏伟的计划中并不重要。我只定义了主键和外键,所以我预计会有一些索引改进。再次感谢您抽出宝贵时间回答这个问题 - 非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
  • 1970-01-01
  • 2015-06-13
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多