第十章——维护索引(6)——查找无用索引

来源:互联网 发布:三维软件solidworks 编辑:程序博客网 时间:2024/06/11 19:08

前言:

众所周知,索引对性能的提升有巨大作用。但是这是有代价的,索引需要磁盘空间来存放它的B-Tree,并且用于在每次DML执行后更新信息,所以应该在一定时期内检查有无无用索引。

 

 

准备工作:

记住别在重启服务器之后进行信息收集,因为DMO将会清空,而数据会非常不准确甚至是错误的。所以应该在运行了一段时间后(业务周期)再做收集。

业务周期根据实际情况而定。一些表和查询会每天频繁使用,但是一些类似报表功能可能是一月甚至一年执行一次,所以,除非必要,不然就让所有东西一直运行,知道你的业务周期完毕。这样会得到相对准确的信息。

 

 

步骤:

执行以下语句:

[sql] view plaincopyprint?
  1. 前言:  
  2. 众所周知,索引对性能的提升有巨大作用。但是这是有代价的,索引需要磁盘空间来存放它的B-Tree,并且用于在每次DML执行后更新信息,所以应该在一定时期内检查有无无用索引。  
  3.   
  4.   
  5. 准备工作:  
  6. 记住别在重启服务器之后进行信息收集,因为DMO将会清空,而数据会非常不准确甚至是错误的。所以应该在运行了一段时间后(业务周期)再做收集。  
  7. 业务周期根据实际情况而定。一些表和查询会每天频繁使用,但是一些类似报表功能可能是一月甚至一年执行一次,所以,除非必要,不然就让所有东西一直运行,知道你的业务周期完毕。这样会得到相对准确的信息。  
  8.   
  9.   
  10. 步骤:  
  11. 执行以下语句:  
  12. SELECT  ind.index_id ,  
  13.         obj.name AS TableName ,  
  14.         ind.name AS IndexName ,  
  15.         ind.type_desc ,  
  16.         indUsage.user_seeks ,  
  17.         indUsage.user_scans ,  
  18.         indUsage.user_lookups ,  
  19.         indUsage.user_updates ,  
  20.         indUsage.last_system_seek ,  
  21.         indUsage.last_user_scan ,  
  22.         'drop index [' + ind.name + '] ON [' + obj.name + ']' AS DropIndexCommand  
  23. FROM    sys.indexes AS ind  
  24.         INNER JOIN sys.objects AS obj ON ind.object_id = obj.object_id  
  25.         LEFT JOIN sys.dm_db_index_usage_stats indUsage ON ind.object_id = indUsage.object_id  
  26.                                                           AND ind.index_id = indUsage.index_id  
  27. WHERE   ind.type_desc <> 'HEAP'  
  28.         AND obj.type <> 'S'  
  29.         AND OBJECTPROPERTY(obj.object_id, 'isusertable') = 1  
  30.         AND ( ISNULL(indUsage.user_seeks, 0) = 0  
  31.               AND ISNULL(indUsage.user_scans, 0) = 0  
  32.               AND ISNULL(indUsage.user_lookups, 0) = 0  
  33.             )  
  34. ORDER BY obj.name ,  
  35.         ind.name  
  36. GO  
  37.   
  38. 分析:  
  39. 为了获得索引名、索引类型、表名,有必要关联sys.Indexes和sys.objects表。  
  40. 通常情况下,当一个索引被使用了,那么在sys.dm_db_index_usage_stats上的user_seek、user_scan、或者user_lookup列上会有一些值。如果索引从来未被使用,那么这些值就为0,也就是没必要保留。  
  41.   
  42. 扩充信息:  
  43. 在决定索引是否有效时,还需要结合你的专业只是。有些索引之所以没有统计数据是因为还没有到使用的周期,或者周期性地重启了服务器,在删除之前,要考虑:  
  44. 1、  是否为主键或者唯一键,因为及时这部分没有数值,但是它们还是可以很好地保证数据的一致性。  
  45. 2、  唯一索引帮助优化器创建更有效的执行计划,及时这些索引未被使用,但是也提供了数据分布的相关信息。  



分析: 

为了获得索引名、索引类型、表名,有必要关联sys.Indexes和sys.objects表。

通常情况下,当一个索引被使用了,那么在sys.dm_db_index_usage_stats上的user_seek、user_scan、或者user_lookup列上会有一些值。如果索引从来未被使用,那么这些值就为0,也就是没必要保留。

 

扩充信息:

在决定索引是否有效时,还需要结合你的专业只是。有些索引之所以没有统计数据是因为还没有到使用的周期,或者周期性地重启了服务器,在删除之前,要考虑:

1、             是否为主键或者唯一键,因为及时这部分没有数值,但是它们还是可以很好地保证数据的一致性。

2、             唯一索引帮助优化器创建更有效的执行计划,及时这些索引未被使用,但是也提供了数据分布的相关信息。


原文:http://blog.csdn.net/dba_huangzj/article/details/8937070

0 0
原创粉丝点击