Badanie użycia indeksów w MSSQL

ŁF

Czasem może zajść potrzeba sprawdzenia, jak często używany jest dany indeks, bo np. przez lata zrobiło się ich dużo (w wyniku działań programistów nie-do-końca-wiedzących-co-robą), a wraz z przyrostem ilości danych optymalizator mógł zacząć korzystać z innych indeksów; teraz sprawdzić co się dzieje i usunąć indeksy zbędne. Poniższymi zapytaniami sprawdzisz m.in. jak często indeksy były przebudowywane i używane do operacji index seek/index scan.

SELECT OBJECT_NAME(A.[OBJECT_ID]) AS [OBJECT NAME], 
       I.[NAME] AS [INDEX NAME]
       ,A.leaf_insert_count
       ,A.leaf_update_count 
       ,A.leaf_delete_count 
       ,A.range_scan_count
       ,A.singleton_lookup_count
FROM   SYS.DM_DB_INDEX_OPERATIONAL_STATS (NULL,NULL,NULL,NULL ) A 
       INNER JOIN SYS.INDEXES AS I 
         ON I.[OBJECT_ID] = A.[OBJECT_ID] 
            AND I.INDEX_ID = A.INDEX_ID 
WHERE  OBJECTPROPERTY(A.[OBJECT_ID],'IsUserTable') = 1 and OBJECT_NAME(A.[OBJECT_ID]) = 'tutaj nazwa tabeli, dla której chcesz sprawdzić wykorzystanie indeksów'
SELECT   OBJECT_NAME(S.[OBJECT_ID]) AS [OBJECT NAME], 
         I.[NAME] AS [INDEX NAME], 
         USER_SEEKS, 
         USER_SCANS, 
         USER_LOOKUPS, 
         USER_UPDATES 
FROM     SYS.DM_DB_INDEX_USAGE_STATS AS S 
         INNER JOIN SYS.INDEXES AS I 
           ON I.[OBJECT_ID] = S.[OBJECT_ID] 
              AND I.INDEX_ID = S.INDEX_ID 
WHERE    OBJECTPROPERTY(S.[OBJECT_ID],'IsUserTable') = 1 and OBJECT_NAME(S.[OBJECT_ID]) = 'tutaj nazwa tabeli, dla której chcesz sprawdzić wykorzystanie indeksów'

Źródło: http://www.mssqltips.com/sqlservertip/1239/how-to-get-index-usage-information-in-sql-server/

0 komentarzy