SQL Server - how to determine if indexes aren't being used?

前端 未结 4 1178
感动是毒
感动是毒 2021-02-14 23:56

I have a high-demand transactional database that I think is over-indexed. Originally, it didn\'t have any indexes at all, so adding some for common processes made a huge differe

4条回答
  •  我在风中等你
    2021-02-15 00:22

    This script will look at the DMV's (dynamic management views) and find those indices that haven't been used.

    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
    

    Mind you - the DMV are dynamic - e.g. they get reset to "nothing" every time you restart your SQL Server services. Don't check those if your server has been up for only a few minutes! Almost all indices will show up in your result set......

    But if you can monitor the result set of this query over time, you should definitely get a feel for which indices aren't being used ever. Very handy indeed !

提交回复
热议问题