Kiedy ostatnio korzystano z mojej bazy?

26-mar-2014

Sposób nr 1

SELECT max(create_date), max(modify_date) FROM SYS.tables

Zapytanie zwróci datę utworzenia ostatniej tabeli lub date jej modyfikacji np. dodania kolumny. A przecież te czynności nie są wykonywane codziennie. Kiedy baza okrzepnie tworzenie tabel odbywa się rzadko. Dlatego wolelibyśmy informację o tym, kiedy rekordy były ostatnio modyfikowane/dodawane, a może nawet czytane, dlatego:

Sposób nr 2

USE <your_db_name>
SELECT OBJECT_NAME(object_id) AS TableName,
last_user_update as LastAction, *
FROM sys.dm_db_index_usage_stats u
WHERE database_id = db_id(db_name())

 index_usage_stats

Zapytanie korzysta z widoku sys.dm_db_index_usage_stats, który zawiera informacje o wykorzystaniu każdego indeksu w baize danych. Zobaczysz tu ile razy indeks był skanowany, przeszukiwany przez seek lub modyfikowany przez polecenia INSERT/UPDATE/DELETE. Dodatkowo znajdziesz też datę i godzinę kiedy te operacje były ostatnio wykonywane.

Jeżeli więc znajdziesz tu zera i NULL-owe daty, tzn. że od momentu włączenia serwera nikt z indeksów należących do tabel nie korzystał.

Pamiętaj jednak, że ten widok traci swoją zawartość przy każdorazowym włączeniu SQL serwera oraz przy odłączaniu/przyłączaniu bazy danych (np. w SQL Server Express jeżeli baza danych ma opcję AUTO_CLOSE ON)

Pod adresem

http://stackoverflow.com/questions/2155594/how-can-i-tell-if-a-database-table-is-being-accessed-anymore-want-something-lik

można znaleźć ładne zapytanie, które dla każdej tabeli zwróci jedną datę ostatniego dostępu:

WITH LastActivity (ObjectID, LastAction) AS
(
SELECT object_id AS TableName,
last_user_seek as LastAction
FROM sys.dm_db_index_usage_stats u
WHERE database_id = db_id(db_name())
UNION
SELECT object_id AS TableName,
last_user_scan as LastAction
FROM sys.dm_db_index_usage_stats u
WHERE database_id = db_id(db_name())
UNION
SELECT object_id AS TableName,
last_user_lookup as LastAction
FROM sys.dm_db_index_usage_stats u
WHERE database_id = db_id(db_name())
)
SELECT OBJECT_NAME(so.object_id) AS TableName,
MAX(la.LastAction) as LastSelect
FROM sys.objects so
LEFT
JOIN LastActivity la
on so.object_id = la.ObjectID
WHERE so.type = 'U’
AND so.object_id > 100
GROUP BY OBJECT_NAME(so.object_id)
ORDER BY OBJECT_NAME(so.object_id)

No a jeśli chcesz wiedzieć coś więcej to:

Sposób nr 3

Założyć audyt lub trace

 

 

 

Komentarze są wyłączone

Autor: Rafał Kraik