【问题标题】:SQL Server - how to determine if indexes aren't being used?SQL Server - 如何确定是否没有使用索引?
【发布时间】:2011-01-03 00:29:17
【问题描述】:

我有一个需求量很大的事务数据库,我认为它的索引过多。本来,它根本没有任何索引,因此为常用流程添加一些会产生巨大的差异。但是,随着时间的推移,我们创建了索引来加速单个查询,并且一些最流行的表上有 10-15 个不同的索引,在某些情况下,这些索引彼此之间只是略有不同,或者是相同的列以不同的顺序。

是否有一种直接的方法来观察数据库活动并判断是否有任何索引不再被命中,或者它们的使用百分比是多少?我担心创建索引是为了加速单个每日/每周查询,甚至是不再运行的查询,但每次数据更改时索引仍必须保持最新。

在高流量表的情况下,这是每秒十几次,我想消除影响数据更新的索引,同时只提供边际改进。

【问题讨论】:

    标签: sql-server database performance indexing


    【解决方案1】:

    此脚本将查看 DMV(动态管理视图)并查找未使用的索引。

    DECLARE  @dbid INT
    
    SELECT @dbid = DB_ID(DB_NAME())
    
    SELECT   
        OBJECTNAME = OBJECT_NAME(I.OBJECT_ID),
        INDEXNAME = I.NAME,
        I.INDEX_ID
    FROM     
        SYS.INDEXES I
    JOIN 
        SYS.OBJECTS O ON I.OBJECT_ID = O.OBJECT_ID
    WHERE    
        OBJECTPROPERTY(O.OBJECT_ID, 'IsUserTable') = 1
        AND I.INDEX_ID NOT IN 
           (SELECT S.INDEX_ID
            FROM SYS.DM_DB_INDEX_USAGE_STATS S
            WHERE S.OBJECT_ID = I.OBJECT_ID
            AND I.INDEX_ID = S.INDEX_ID
            AND DATABASE_ID = @dbid)
    ORDER BY 
        OBJECTNAME, I.INDEX_ID, INDEXNAME ASC
    

    请注意 - DMV 是动态的 - 例如。每次重新启动 SQL Server 服务时,它们都会重置为“无”。如果您的服务器仅启动了几分钟,请不要检查这些!几乎所有的索引都会出现在你的结果集中......

    但是,如果您可以随着时间的推移监控此查询的结果集,那么您肯定应该了解哪些索引从未被使用过。确实很方便!

    【讨论】:

      【解决方案2】:

      如果您使用的是 SQL Server 2005/2008,则应使用 Database Tuning advisor

      您可以指定它运行给定的时间长度,它会收集有关正在使用和未使用的统计信息。在运行结束时,它会提出一些非常有用的意见,说明如何优化您的索引策略。

      【讨论】:

        【解决方案3】:

        数据库调优向导在这里会很有帮助。使用 Profiler 在几个小时内记录一组标准查询,并在 Tuning Wizard 中使用该跟踪文件来识别可能的冗余索引。

        【讨论】:

        • 莱姆斯的回答也是一种看待这个的方式。
        【解决方案4】:

        查看sys.dm_db_index_usage_stats 中的用户搜索/扫描/查找次数和最后一次用户搜索/扫描/查找次数。这些统计信息会在服务器启动时重置,因此您必须在服务器启动并运行相关负载足够的时间后进行检查。

        【讨论】:

        • 这正是我想知道的——有很多索引,其中 USER 和 SYSTEM 列(查找、查找和扫描)都是 0,这表明这些索引不是做任何好事。
        猜你喜欢
        • 2010-09-14
        • 1970-01-01
        • 1970-01-01
        • 2014-10-25
        • 1970-01-01
        • 2013-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多