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


    /*前言: 
    众所周知,索引对性能的提升有巨大作用。但是这是有代价的,索引需要磁盘空间来存放它的B-Tree,并且用于在每次DML执行后更新信息,所以应该在一定时期内检查有无无用索引。 
      
      
    准备工作: 
    记住别在重启服务器之后进行信息收集,因为DMO将会清空,而数据会非常不准确甚至是错误的。所以应该在运行了一段时间后(业务周期)再做收集。 
    业务周期根据实际情况而定。一些表和查询会每天频繁使用,但是一些类似报表功能可能是一月甚至一年执行一次,所以,除非必要,不然就让所有东西一直运行,知道你的业务周期完毕。这样会得到相对准确的信息。 
      
      
    步骤: 
    执行以下语句:*/ 
    SELECT  ind.index_id ,  
            obj.name AS TableName ,  
            ind.name AS IndexName ,  
            ind.type_desc ,  
            indUsage.user_seeks ,  
            indUsage.user_scans ,  
            indUsage.user_lookups ,  
            indUsage.user_updates ,  
            indUsage.last_system_seek ,  
            indUsage.last_user_scan ,  
            'drop index [' + ind.name + '] ON [' + obj.name + ']' AS DropIndexCommand  
    FROM    sys.indexes AS ind  
            INNER JOIN sys.objects AS obj ON ind.object_id = obj.object_id  
            LEFT JOIN sys.dm_db_index_usage_stats indUsage ON ind.object_id = indUsage.object_id  
                                                              AND ind.index_id = indUsage.index_id  
    WHERE   ind.type_desc <> 'HEAP'  
            AND obj.type <> 'S'  
            AND OBJECTPROPERTY(obj.object_id, 'isusertable') = 1  
            AND ( ISNULL(indUsage.user_seeks, 0) = 0  
                  AND ISNULL(indUsage.user_scans, 0) = 0  
                  AND ISNULL(indUsage.user_lookups, 0) = 0  
                )  
    ORDER BY obj.name ,  
            ind.name  
    GO  
    /*  
    分析: 
    为了获得索引名、索引类型、表名,有必要关联sys.Indexes和sys.objects表。 
    通常情况下,当一个索引被使用了,那么在sys.dm_db_index_usage_stats上的user_seek、user_scan、或者user_lookup列上会有一些值。如果索引从来未被使用,那么这些值就为,也就是没必要保留。 
      
    扩充信息: 
    在决定索引是否有效时,还需要结合你的专业只是。有些索引之所以没有统计数据是因为还没有到使用的周期,或者周期性地重启了服务器,在删除之前,要考虑: 
    1、 是否为主键或者唯一键,因为及时这部分没有数值,但是它们还是可以很好地保证数据的一致性。 
    2、 唯一索引帮助优化器创建更有效的执行计划,及时这些索引未被使用,但是也提供了数据分布的相关信息。 */
  • 相关阅读:
    SSM集成Mybatis和Druid
    SpringMVC集成Thymeleaf
    最简单的SpringMVC + Maven配置
    信息化平台架构设计
    TaskSchedule-任务调度系统设计
    Redis的类库封装设计
    [oracle] DBLINK +同义词,实现本地数据库访问另一台机器的数据库
    [Tomcat 部署问题] Undeployment Failure could not be redeployed ...
    [oracle原]访问局域网内出现“ORA-12541:TNS:无监听程序”
    [java插件]myeclipse添加插件
  • 原文地址:https://www.cnblogs.com/binghou/p/9109498.html
Copyright © 2020-2023  润新知