find一个可操作的SQL Server数据库的不必要的索引的方法?

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

对于SQL Server 2005/2008,是否有一个通用的过程或工具来分析数据库工作负载,并提供哪些索引在特定的操作数据库上从不使用或不必要?

谢谢!

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

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

关于使用sys.dm_db_index_usage_stats要记住一些事情:

  1. 输出只包含自上次数据库启动以来使用的索引。 当数据库closures时,该数据库信息的内存caching中的所有条目都将被删除。 同样,高速caching不能立即重新启动。 无法在不重新启动数据库的情况下手动清除特定数据库的条目。 第一个答案(以及我的博客)中引用的各种文章描述了如何在不同时间捕获输出以进行时间序列分析。
  2. 一定要testing你的整个商业周期。 您不想删除用于月末报表或CEO查询的索引,即使它可能是诱人的。
  3. 在决定指数是否被有效使用或者是维持在牺牲之前,确保你了解各种指数和它们的含义。

希望这可以帮助。

PS对于其他读者来说,还有一件事是想知道SQL Server 2000是否有相当的方法 – 不,我们(就像我当时在团队中一样)只增加了2005年以后的function。

我们在SQLServerPedia上有一篇关于如何使用它的脚本的wiki文章,以及一个关于如何使用它的教程video:

一个find索引不被使用:

http://sqlserverpedia.com/wiki/Find_Indexes_Not_In_Use

另一个find你应该添加的索引:

http://sqlserverpedia.com/wiki/Find_Missing_Indexes

尝试从Sys.dm_db_index_usage_stats左joinselect*。 你可以看到哪些从未被触摸。 确保他们已经足够长,但是在创build新索引之后运行这个可能还不够。

另外值得注意的是索引今天可能不会被使用,但是随着数据量的增加,优化程序会认为索引更好。 通常,对于小(新)表,优化器将始终进行扫描,但在行数超过临界点时将开始寻找

戴夫J

编辑:埃文打我,但他是现货。

编辑2:纠正意见,忘了反join位!

我做了一些索引相关的查询,我已经在我的博客( http://dbalink.wordpress.com/2008/11/09/how-to-finding-index-usage-stats-with-dmv-in -tsql / )

请记住,SQL Server不知道你的业务。 它不知道你的公司做出了什么样的业务战术和战略决策,正在做什么,会做什么。

这意味着今天缺失的指数可能与明天无关,或者可能变得更相关。 同样的逻辑适用于根本没有被使用或根本不被使用的索引。

在SQL Server RTM中,我编写了自己的脚本来仔细阅读和报告DM表,并考虑自动化他们的活动。 一眼就看到索引报告丢失,SQL Server要求将表中所有剩余的列作为“包含”列添加到具有非常dynamic内容的表的索引上,这是我不需要自动化过程的威慑力。

我仍然使用我的脚本,但是我将我公司的业务决策应用于我所做的事情 – 我可以在一家小公司做些事情。

像往常一样,了解您的数据,了解您的业务,了解您的业务方向。