【问题标题】:What is a bad index in SQL Server and how to identify those?SQL Server 中的坏索引是什么以及如何识别这些索引?
【发布时间】:2015-10-01 09:35:27
【问题描述】:

您能解释一下 SQL Server 中的坏索引是什么吗?

【问题讨论】:

    标签: sql sql-server-2008 indexing


    【解决方案1】:

    当创建索引的列从未被使用时,您可以将索引称为坏索引。而且您正在表中的同一列上执行大量更新操作。你可以试试这个查询来识别坏索引:Finding Bad Indexes Using SQL Server

    SELECT  OBJECT_NAME(s.object_id) AS 'Table Name',
            i.name AS 'Index Name',
            i.index_id,
            user_updates AS 'Total Writes',
            user_seeks + user_scans + user_lookups AS 'Total Reads',
            user_updates - ( user_seeks + user_scans + user_lookups ) AS 'Difference'
    FROM    sys.dm_db_index_usage_stats AS s WITH ( NOLOCK )
            INNER JOIN sys.indexes AS i WITH ( NOLOCK ) ON s.object_id = i.object_id
                                                           AND i.index_id = s.index_id
    WHERE   OBJECTPROPERTY(s.object_id, 'IsUserTable') = 1
            AND s.database_id = DB_ID()
            AND user_updates > ( user_seeks + user_scans + user_lookups )
            AND i.index_id > 1
    ORDER BY 'Difference' DESC,
            'Total Writes' DESC,
            'Total Reads' ASC ;
    -- Index Read/Write stats for a single table
    SELECT  OBJECT_NAME(s.object_id) AS 'TableName',
            i.name AS 'IndexName',
            i.index_id,
            SUM(user_seeks) AS 'User Seeks',
            SUM(user_scans) AS 'User Scans',
            SUM(user_lookups) AS 'User Lookups',
            SUM(user_seeks + user_scans + user_lookups) AS 'Total Reads',
            SUM(user_updates) AS 'Total Writes'
    FROM    sys.dm_db_index_usage_stats AS s
            INNER JOIN sys.indexes AS i ON s.object_id = i.object_id
                                           AND i.index_id = s.index_id
    WHERE   OBJECTPROPERTY(s.object_id, 'IsUserTable') = 1
            AND s.database_id = DB_ID()
            AND OBJECT_NAME(s.object_id) = 'AccountTransaction'
    GROUP BY OBJECT_NAME(s.object_id),
            i.name,
            i.index_id
    ORDER BY 'Total Writes' DESC,
            'Total Reads' DESC ;
    

    【讨论】:

    • 这个查询的更新程度如何?例如对于 SQL Server 2014=
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    相关资源
    最近更新 更多