Aus*_*hin 12 index sql-server-2005
我一直在运行这个脚本来试图找到无关的索引
select o.name as TableName, i.name as IndexName, p.reserved_page_count * 8.0 / 1024 as SpaceInMB, s.*
from sys.dm_db_index_usage_stats s
inner join sys.objects o on s.object_id = o.object_id
inner join sys.indexes i on i.index_id = s.index_id and i.object_id = o.object_id
inner join sys.dm_db_partition_stats p on i.index_id = p.index_id and o.object_id = p.object_id
where o.name = ‘TableName’
Run Code Online (Sandbox Code Playgroud)
我知道当 last_user_seek/scan/lookup 都为空时,自上次重启以来没有用户使用过索引。但我想知道 system_scans/lookups/seeks 是什么?因为在某个表上我发现了 5 个没有用户活动的,但一个在 10 天前有系统活动。有没有人对系统扫描/搜索/查找可能有任何了解?这些表似乎真的过度索引,我想减少脂肪。
Mar*_*ith 10
索引维护(重建/重组)和 DBCC CHECKDB 活动最有可能,可能是统计更新。是否配置了定期维护?
如果没有用户访问权限,将它们装箱。请注意您决定不再使用它们的时间范围。例如,是否有任何每周或每月报告任务?
在您寻找的同时,还要四处寻找重复的索引。
编辑:关于SSC 链接
快速浏览一下帖子,看起来 SSC 的人也有类似的想法。然而,他们对这些索引可能的“偶尔”使用采取更谨慎的立场,认为有人将它们放在那里是有原因的,这是一个完全合理的论点。相反的论点是,它往往恰恰相反,有人将它们放在那里,因为他们认为这是正确的做法,但由于缺乏理解或缺乏测试,事实并非如此。
除了删除未使用的和重复的索引之外,我什么都不做,已经将几个系统从边缘带回来了。过度索引会导致混乱。
这是您的系统,您需要了解并权衡保留这些索引或删除它们的风险。如果您决定继续投放,请记录您所做的事情、为什么要这样做,编写索引并发布给所有感兴趣的各方。