我有一个过程,它收集了一系列实例和数据库的索引使用情况,主要使用sys.dm_db_index_usage_stats。然后我将浏览USER_UPDATES值为高,USER_SEEKS,USER_SCANS,USER_LOOKUPS值为0的索引,表示索引未被使用,并删除它们。
我遇到的问题是,下次运行该过程时,它并不反映索引已被删除,因为sys.dm_db_index_usage_stats仅在重新启动SQL Server服务或重建索引时重置。
我不想在删除它之前重建索引。有人有更好的建议吗?
答案 0 :(得分:0)
我认为没有办法重置DMV sys.dm_db_index_usage_stats。
根据BOL,
每当启动SQL Server(MSSQLSERVER)服务时,计数器都会初始化为空。此外,无论何时分离或关闭数据库(例如,因为AUTO_CLOSE设置为ON),都会删除与数据库关联的所有行。
解决方法是使用带有标志的用户表中的信息来保留索引被删除时的标记。 下次运行SP时,请查看此用户表并验证索引是否已被删除。
但是你需要做这一切,我相信你会使用动态SQL来删除索引,用IF EXISTS块包装它们可以帮到你吗?
答案 1 :(得分:0)
加入sys.indexes并检查WHERE name IS NOT NULL
确实有效,我实际上已经实现了这个,我的程序中只有一个愚蠢的错误。感谢弗拉基米尔和其他所有人,抱歉浪费你的时间。