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).

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

SQL Server - sys.dm_db_index_usage_stats last table view access date 1
SQL Server - sys.dm_db_index_usage_stats last table view access date 1

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.

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

SQL Server - dm_exec_query_stats last stored procedure execution date
SQL Server - dm_exec_query_stats last stored procedure execution date

É 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