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;