除了浪费数据库空间外,SQL Server 上不必要的索引还会减慢插入和更新操作的速度。缺乏数据库原理经验的开发人员有时倾向于创建对正在运行的查询毫无意义的表索引。
SQL Server 2005/2008 是否有一个常用的程序或工具来分析数据库工作负载并提示哪些索引从未使用过或对某个操作数据库来说是不必要的?
谢谢你!
答案1
我在这里看到了一个可爱的小T-SQL脚本(http://blog.sqlauthority.com/2008/02/11/sql-server-2005-find-unused-indexes-of-current-database/)显示应在 SQL Server 2005 上运行的未使用索引。另一个http://aspadvice.com/blogs/ssmith/archive/2008/03/31/Find-Unused-SQL-2005-Indexes-for-Current-DB.aspx这里也。
看起来 dm_db_index_usage_stats 是这一切的关键。 太棒了!(见http://msdn.microsoft.com/en-us/library/ms188755.aspx 我现在必须去查看我创建的一些生产数据库,看看这些统计数据是什么样的。(微笑)
编辑:这里有一些非常好的附加背景:http://blogs.msdn.com/craigfr/archive/2008/10/30/what-is-the-difference-between-sys-dm-db-index-usage-stats-and-sys-dm-db-index-operational-stats.aspx
答案2
使用 sys.dm_db_index_usage_stats 时需要注意以下几点:
- 输出仅包含自上次启动数据库以来使用过的索引。当数据库关闭时,该数据库的内存缓存中的所有条目都将被删除。同样,缓存在即时重启后也无法保留。没有办法在不重启数据库的情况下手动清除特定数据库的条目。第一个答案中引用的各种文章(以及我的博客中的文章)描述了如何在不同时间捕获输出以进行时间序列分析。
- 一定要测试你的全部的商业周期。您不会想删除用于月末报告或 CEO 查询的索引,尽管这样做可能很诱人。
- 在决定该指数是否有利地使用,或者仅仅是以成本的方式维持之前,请确保您了解各种计数和它们的含义。
希望这可以帮助。
PS 对于其他阅读本文并想知道 SQL Server 2000 是否有等效方法的人,还有一件事 - 没有,我们(因为我当时在团队中)只为 2005 年及以后添加了该功能。
答案3
我们在 SQLServerPedia 上有一篇 wiki 文章,其中有一个执行此操作的脚本,还有一个关于如何使用它的教程视频:
查找未使用的索引:
http://sqlserverpedia.com/wiki/Find_Indexes_Not_In_Use
另外查找您应该添加的索引:
答案4
我做了一些与索引相关的查询,并在我的博客中展示了这一点(http://dbalink.wordpress.com/2008/11/09/how-to-finding-index-usage-stats-with-dmv-in-tsql/)