Отслеживание использования хранимых процедур

19

Помимо использования SQL Server Profiler, есть ли способ отследить, какие хранимые процедуры используются, или, по крайней мере, когда они выполнялись в последний раз?

DForck42
источник
4
Вы всегда можете посмотреть на кеш плана. SQL Server не отслеживает эти вещи вечно, потому что метаданные быстро становятся большими и дорогими.
JNK

Ответы:

17

Вы можете заглянуть в кэш плана, чтобы получить довольно хорошее представление об использовании хранимых процедур. Возьмите этот запрос, например:

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

Это даст вам usecountsхранимых процедур, которые кешируются в отношении SomeDB.

Примечание. Кэш планов содержит планы выполнения. Это сохранение этих планов имеет много факторов. Принимая во внимание, что это даст вам хорошее представление о том, что используется и как часто, это определенно не промежуточный итог хранимых процедур, а как часто / когда они выполнялись.

BOL Ссылка на кэш плана

Томас Стрингер
источник
4
Помните, это только говорит о том, что sp был запущен сравнительно недавно, и не дает вам никакой информации о процессах, которых здесь нет. Такие вещи, как процедуры за квартальными отчетами, запускаются нечасто, но используются. Таким образом, в основном, это просто дает вам список для исследования приложений, которые попали в вашу базу данных.
HLGEM
1
@HLGEM Точно. Я постарался прояснить это в своем ответе.
Томас Стрингер
Возможно ли это сделать для определенного диапазона времени и даты? (например, последний день / месяц и т. д.)?
Хосе Парра
Обратите внимание, что этот запрос не вернет строку для хранимой процедуры, которая была изменена и не выполнена после.
Axel2D
10

Вы можете взглянуть на это, так как оно содержит информацию last_execution_timeо каждой хранимой процедуре.

    SELECT DB_NAME(database_id)
    ,OBJECT_NAME(object_id,database_id)
    ,cached_time
    ,last_execution_time
    ,execution_count
FROM sys.dm_exec_procedure_stats
Саи Чайтанья М
источник
Существует оговорка к этому. Эта статистика сохраняется только с момента последнего выполнения базы данных. Я занят написанием работы, которая будет архивировать ее на стол один раз в день.
earthling42
@ earthling42, ты когда-нибудь писал работу, которая ежедневно архивировала ее на стол?
Алекс Чунг
@ Алекс Чунг - к сожалению, никогда не удосужился к этому. Перешел на проекты не MS-SQL вскоре после даты этого поста. Не должно быть трудно? Я был бы рад попытаться решить это с вами, если вы заинтересованы.
earthling42