Rastreando o uso do procedimento armazenado

19

Além de usar o SQL Server Profiler, existe alguma maneira de rastrear quais procedimentos armazenados estão sendo usados ​​ou pelo menos quando eles foram executados pela última vez?

DForck42
fonte
4
Você sempre pode olhar para o cache do plano. O SQL Server não rastreia esse material para sempre, porque os metadados rapidamente ficam grandes e caros.
JNK

Respostas:

17

Você pode procurar no cache do plano para ter uma boa idéia do uso do Procedimento Armazenado. Tome esta consulta, por exemplo:

select
    db_name(st.dbid) as database_name,
    object_name(st.objectid) as name,
    p.size_in_bytes / 1024 as size_in_kb,
    p.usecounts,
    st.text
from sys.dm_exec_cached_plans p
cross apply sys.dm_exec_sql_text(p.plan_handle) st
where p.objtype = 'proc'
and st.dbid = db_id('SomeDatabase')
order by p.usecounts desc

Isso fornecerá os usecountsprocedimentos armazenados armazenados em cache pertencentes a SomeDB.

Nota: o cache do plano contém os planos de execução. Essa retenção desses planos tem muitos fatores envolvidos. Considerando que isso lhe dará uma boa idéia do que está sendo usado e com que frequência, definitivamente não é o total em execução de procedimentos armazenados e com que frequência / quando eles foram executados.

Referência BOL sobre o cache do plano

Thomas Stringer
fonte
4
Lembre-se de que isso indica apenas que o sp foi executado recentemente e não fornece informações sobre procs que não estão aqui. Coisas como procs por trás de relatórios trimestrais são executados com pouca frequência, mas estão sendo usadas. Então, basicamente, isso fornece uma lista para pesquisas nos aplicativos que atingem seu banco de dados.
HLGEM
11
@HLGEM Precisamente. Eu tentei deixar esse ponto claro na minha resposta.
Thomas Stringer
É possível fazer isso para um intervalo de data e hora específico? (por exemplo, último dia / mês, etc)?
Jose Parra
Observe que esta consulta não retornará uma linha para um procedimento armazenado que foi alterado e não executado após.
Axel2D
10

Você pode dar uma olhada nisso, além de conter informações last_execution_timede todos os procedimentos armazenados.

    SELECT DB_NAME(database_id)
    ,OBJECT_NAME(object_id,database_id)
    ,cached_time
    ,last_execution_time
    ,execution_count
FROM sys.dm_exec_procedure_stats
Sai Chaitanya M
fonte
Há uma ressalva a este tho. Essas estatísticas são mantidas apenas desde a última execução do banco de dados. Estou ocupado escrevendo um trabalho que o arquivará em uma tabela uma vez por dia.
earthling42
@ earthling42, você já escreveu um trabalho que o arquivava em uma mesa diariamente?
Alex Chung
@ Alex Chung - infelizmente nunca cheguei a isso. Movido para projetos não MS-SQL logo após a data desta postagem. Não deveria ser difícil? Ficaria feliz em tentar resolver isso com você, se você estiver interessado.
earthling42