3

我试图查看 sys.dm_db_missing_index_details 以检查我的 SQL Server 2005 数据库上是否缺少索引。它不返回任何行。

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

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

是否仅在某些版本的 SQL Server 2005 上支持?

提前感谢您提供的任何帮助。

4

2 回答 2

6

它似乎默认情况下处于打开状态 - 尽管检查您用于启动的任何快捷方式并确保它没有以-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/库/ms345485(v=SQL.90).aspx

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

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

于 2011-04-07T12:44:24.137 回答
1

另一种选择是直接查询计划缓存——这还有一个好处是它可以让你得到想要索引的查询。SO上有一个相关的问题——BankZ的答案有一个完整的SQL脚本可以完成这项工作。

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

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

于 2011-04-13T10:43:49.837 回答