索引使用情况、监视和删除未使用的索引 - SQL Server 2008 R2



我有一个过程,可以收集一系列实例和数据库的索引使用情况,主要使用sys.dm_db_index_usage_stats。然后,我将遍历USER_UPDATES值较高且USER_SEEKS、USER_SCANS USER_LOOKUPS值为 0 的索引,表示未使用该索引,并删除它们。

我遇到的问题是,下次运行该过程时,它不会反映索引已被删除,因为sys.dm_db_index_usage_stats仅在重新启动 SQL Server 服务或重建索引时重置。

我宁愿在删除索引之前不必重建索引。有人有更好的建议吗?

我认为

没有办法重置DMV sys.dm_db_index_usage_stats。

根据 BOL 的说法,

每当启动 SQL Server (MSSQLSERVER) 服务时,计数器都会初始化为空。此外,每当分离或关闭数据库时(例如,因为AUTO_CLOSE设置为 ON),都会删除与该数据库关联的所有行。

解决方法是使用将信息持久保存在用户表中,并带有标记来标记何时删除索引。下次运行 SP 时,请查看此用户表并验证索引是否已被删除。

但是您是否需要做所有这些,我相信您将使用动态SQL来删除索引,用IF EXIST块包装它们可以帮助您?

加入 sys.indexes 并检查WHERE name IS NOT NULL确实有效,事实上我已经实现了它,我的过程中在其他地方只是一个愚蠢的错误。感谢弗拉基米尔和其他所有人,很抱歉浪费你的时间。

最新更新