我的索引是否被使用?

pet*_*ter 4 sql-server-2008

我正在使用 SQL 服务器,创建我们数据库的人在我们最大的表上添加了很多索引。这些索引每个只包含一个字段。

对我来说,这些索引似乎几乎没有用,这是一个坏主意。

我担心的是删除部分或全部这些索引并影响我们实时系统的性能。无法在我们的测试系统上对此进行测试,因为我们的测试系统没有相同的负载或数据量。

就是想...

  • 有没有办法确定哪些索引从未使用过?
  • 例如,是否有某种分析可以显示在一段时间内哪些索引用于哪些查询?

小智 6

这通过索引使用 DMV 变得非常简单: sys.dm_db_index_usage_stats

例如,我经常使用这个查询来识别未使用的索引:

SELECT o.name Object_Name,
       i.name Index_name, 
       i.Type_Desc 
 FROM sys.objects AS o
     JOIN sys.indexes AS i
 ON o.object_id = i.object_id 
  LEFT OUTER JOIN 
  sys.dm_db_index_usage_stats AS s    
 ON i.object_id = s.object_id   
  AND i.index_id = s.index_id
 WHERE  o.type = 'u'
-- Clustered and Non-Clustered indexes
  AND i.type IN (1, 2) 
-- Indexes without stats
  AND (s.index_id IS NULL) OR
-- Indexes that have been updated by not used
      (s.user_seeks = 0 AND s.user_scans = 0 AND s.user_lookups = 0 );
Run Code Online (Sandbox Code Playgroud)

该查询是从sql-server-performance.com逐字提取的但由于他们的博客平台放入了长破折号和智能引号,因此在他们的网站上呈现代码不可复制粘贴。(为什么?为什么在代码博客上??)所以我把它放在一个你可以使用而无需解决语法错误的形式中。

这一切都归功于他们以及我依赖的许多其他有用的代码片段。