查找操作 SQL Server 数据库的不必要索引的方法?

spl*_*tne 5 indexes optimization performance sql-server

除了浪费数据库空间之外,SQL Server 上不必要的索引会减慢插入和更新操作的速度。缺乏数据库原理经验的开发人员有时倾向于创建对正在运行的查询没有意义的表索引。

是否有适用于 SQL Server 2005/2008 的通用程序或工具来分析数据库工作负载并提示在某个操作数据库上从未使用或不需要哪些索引?

谢谢!

Eva*_*son 5

我在这里看到一个可爱的小 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 我要去看看我现在创建的一些生产数据库,看看这些统计数据是什么样的。(微笑

编辑:这里有一些非常好的 addt'l 背景: http://blogs.msdn.com/craigfr/archive/2008/10/30/what-is-the-difference-between-sys-dm-db-index-usage-stats-and-sys-dm-db-索引操作stats.aspx


Pau*_*dal 5

使用 sys.dm_db_index_usage_stats 时要记住以下几点:

  1. 输出仅包含自上次启动数据库以来使用过的索引。当数据库关闭时,该数据库信息的内存缓存中的所有条目都将被删除。类似地,缓存不会在即时重启后继续存在。在不重新启动数据库的情况下,无法手动清除特定数据库的条目。第一个答案(以及我的博客)中引用的各种文章描述了如何在不同时间捕获输出以进行时间序列分析。
  2. 一定要测试你的整个商业周期。您不想删除用于月末报告或 CEO 查询的索引,即使它可能很诱人。
  3. 在决定该指数是被有利可图地使用还是只是以费用维持之前,请确保您了解各种计数及其含义。

希望这可以帮助。

PS 对于阅读本文并想知道 SQL Server 2000 是否有等效方法的其他人来说,还有一件事 - 不,我们(当时我在团队中)只添加了 2005 年以后的功能。