除了在数据库上浪费空间之外,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要记住一些事情:
希望这可以帮助。
PS对于其他读者来说,还有一件事是想知道SQL Server 2000是否有相当的方法 – 不,我们(就像我当时在团队中一样)只增加了2005年以后的function。
我们在SQLServerPedia上有一篇关于如何使用它的脚本的wiki文章,以及一个关于如何使用它的教程video:
一个find索引不被使用:
http://sqlserverpedia.com/wiki/Find_Indexes_Not_In_Use
另一个find你应该添加的索引:
尝试从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内容的表的索引上,这是我不需要自动化过程的威慑力。
我仍然使用我的脚本,但是我将我公司的业务决策应用于我所做的事情 – 我可以在一家小公司做些事情。
像往常一样,了解您的数据,了解您的业务,了解您的业务方向。