Olá pessoal,
Boa noite!
Neste post vou mostrar pra vocês como identificar a data de último acesso de uma tabela ou view e a data da última execução de uma procedure no SQL Server. Isso é especialmente útil pra identificar tabelas que não estão sendo utilizadas ou mesmo entender o quanto são utilizadas.
Para isso, o SQL Server nos disponibiliza a excelente DMV sys.dm_db_index_usage_stats, que apesar do nome, funciona tanto para tabelas com índices (clustered e non-clustered) quanto para tabelas HEAP (sem índices).
Um ponto de atenção para quem for utilizar essa view, é que quando a instância é reiniciada os dados são resetados.
Como descobrir a data e hora do último acesso de uma tabela ou view
Com uma query até um pouco simples, podemos facilmente observar a data do último acesso do objeto, a data do último acesso por tipo de leitura e os tipos de leituras que foram identificados pela view
Para identificar as tabelas ou views que não foram lidas desde que a instância foi reiniciada, basta verificar os registros onde a coluna last_access está vazia (last_access IS NULL).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
SELECT A.name AS [object_name], A.type_desc, B.database_id, C.name AS index_name, ( SELECT MAX(Ultimo_Acesso) FROM (VALUES (B.last_user_seek),(B.last_user_scan),(B.last_user_lookup),(B.last_user_update)) AS DataAcesso(Ultimo_Acesso) ) AS last_access, B.last_user_seek, B.last_user_scan, B.last_user_lookup, B.last_user_update, NULLIF( (CASE WHEN B.last_user_seek IS NOT NULL THEN 'Seek, ' ELSE '' END) + (CASE WHEN B.last_user_scan IS NOT NULL THEN 'Scan, ' ELSE '' END) + (CASE WHEN B.last_user_lookup IS NOT NULL THEN 'Lookup, ' ELSE '' END) + (CASE WHEN B.last_user_update IS NOT NULL THEN 'Update, ' ELSE '' END) , '') AS operations FROM sys.objects A LEFT JOIN sys.dm_db_index_usage_stats B ON B.[object_id] = A.[object_id] AND B.[database_id] = DB_ID() LEFT JOIN sys.indexes C ON C.index_id = B.index_id AND C.[object_id] = B.[object_id] WHERE A.[type_desc] IN ('VIEW', 'USER_TABLE') ORDER BY A.name, B.index_id |
Ao testar o exemplo acima, lembre-se de alterar o database msdb para o de sua necessidade ou deixe sem database especificado caso você utilize o database do contexto da sua conexão.
Como descobrir a data e hora da última execução de uma stored procedure
Para conseguir obter essa visão, utilizamos a DMV sys.objects para obter a lista de procedures e functions do database msdb, fazemos um LEFT JOIN com a sys.dm_exec_query_stats, que é onde ficam armazenados os planos de execução em cache da instância e realizamos um CROSS APPLY com a DMV sys.dm_exec_sql_text, que á DMV responsável por armazenar os comandos executados pelos planos de execução em cache.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
SELECT A.name AS [object_name], A.type_desc, MAX(B.last_execution_time) AS last_execution_time FROM sys.objects A LEFT JOIN ( sys.dm_exec_query_stats B CROSS APPLY sys.dm_exec_sql_text(B.sql_handle) C ) ON A.[object_id] = C.objectid WHERE A.type_desc LIKE '%_PROCEDURE' GROUP BY A.name, A.type_desc ORDER BY 3 DESC, 1 |
É isso aí, leitores!
Duas queries simples, rápidas e úteis no dia a dia.
Abraço!
sql sql server como descobrir data do último acesso última leitura da tabela view como descobrir data de execução de stored procedure
sql sql server como descobrir data do último acesso última leitura da tabela view como descobrir data de execução de stored procedure
sql server como descobrir tabelas não lidas acessadas não utilizadas tables not used last access date table stored procedure não utilizadas not used
sql server como descobrir tabelas não lidas acessadas não utilizadas tables not used last access date table stored procedure não utilizadas not used
Script tooop
Dirceu muito obrigado
Só apresenta a última execução do dia? Se a procedure não foi executada neste não não vai trazer nada?
Não traz a execução de view. Pode me ajudar?
Boas,
Scripts muito uteis, obrigado ajudaram muito.
Abraços,
Ótimo artigo, parabéns… me ajudou muito.
Obrigado