sys.dm_db_index_usage_stats

Z dokumentacji technet ( http://msdn.microsoft.com/en-us/library/ms188755%28v=sql.105%29.aspx )

„Every individual seek, scan, lookup, or update on the specified index by one query execution is counted as a use of that index and increments the corresponding counter in this view. Information is reported both for operations caused by user-submitted queries, and for operations caused by internally generated queries, such as scans for gathering statistics. „

Innimi słowy jest takie miejsce w SQL Server, które po każdym restarcie SQL Server rejestruje od nowa statystyki dostępów do tabel we wszystkich bazach.
Każdorazowo, gdy użytkownik (kolumny *user*) lub system (kolumny *system*) „dotknie” indexu danej tabeli odkładany jest w liczniku ten fakt (+1) i zapamięta datę. Jeśli zapytanie nie używało żadnego indeksu to odłoży się ono w postaci index_id = 0. Dzięki temu możemy określić stopień wykorzystania jakiegoś indeksu przez polecenia odczytujące lub zapisujące dane.
Ale jest jeszcze jedna przydatna informacja, jaką daje ten widok dynamiczny, mianowicie można na jego podstawie wywnioskować czy dana tabela była używana od ostatniego restartu serwera (czy ktoś do niej coś zapisywał lub z niej odczytywał).

UWAGA!
Aby móc odpytywac się ww. widoku dynamicznego, niestety wymagane są uprawnienia na poziomie serwera o nazwie: VIEW SERVER STATE.
Domyślnie zwykły użytkownik nie ma takich uprawnień. Dlatego nie wszyscy będą mogli to zapytanie wywołać. Jednak dobrze jest wiedzieć o możliwości wyciągnięcia takiej informacji np. przez admina 🙂

Przykład:

USE AdventureWorks2012
GO

CREATE TABLE TEST (col1dummy int)

INSERT INTO TEST DEFAULT VALUES
GO

SELECT  Tabela = OBJECT_NAME(Object_id) ,
        [Ostatni odczyt] = ( SELECT MAX(odczyt)
                             FROM   ( VALUES ( MAX(last_user_seek)),
                                    ( MAX(last_user_scan)),
                                    ( MAX(last_user_lookup)) ) tvc ( odczyt ) 
                           ) ,
        [Ostatni zapis] = MAX(last_user_update)
FROM    sys.dm_db_index_usage_stats
WHERE   database_id = DB_ID()
GROUP BY OBJECT_NAME(Object_id)
ORDER BY [Ostatni zapis] DESC ,
        [Ostatni odczyt] DESC

Wynik:

 

wersja z schema name:

SELECT  Schemat = s.name ,
        Tabela = OBJECT_NAME(i.object_id) ,
        [Ostatni odczyt] = ( SELECT MAX(odczyt)
                             FROM   ( VALUES ( MAX(last_user_seek)),
                                    ( MAX(last_user_scan)),
                                    ( MAX(last_user_lookup)) ) tvc ( odczyt )
                           ) ,
        [Ostatni zapis] = MAX(last_user_update)
FROM    sys.dm_db_index_usage_stats i
        JOIN sys.objects o ON i.object_id = o.object_id
        JOIN sys.schemas s ON o.schema_id = s.schema_id
WHERE   database_id = DB_ID()
GROUP BY s.name ,
        OBJECT_NAME(i.object_id)
ORDER BY [Ostatni zapis] DESC ,
        [Ostatni odczyt] DESC;

 

Post pierwotnie opublikowany jako TSQL na dziś #6

Dodaj komentarz