Назад | Перейти на главную страницу

Как узнать, когда хранимые процедуры выполнялись последний раз

Я хочу увидеть список всех сохраненных процессов для каждой базы данных на сервере, а также время последнего запуска этого процесса хранилища. Я неплохо разбираюсь в SQL, но я не знаю, как смотреть такую ​​статистику, которую хранит sql, поэтому я был бы признателен за небольшую помощь в поиске этой информации.

РЕДАКТИРОВАТЬ:

Из ответов, которые я получаю, кажется, что это невозможно, как я думал. Я думал, что это можно сделать аналогично тому, как вы можете увидеть, когда к таблице последний раз обращались:

select  t.name, user_seeks, user_scans, user_lookups, user_updates, 
        last_user_seek, last_user_scan, last_user_lookup, last_user_update

from    sys.dm_db_index_usage_stats i JOIN
        sys.tables t ON (t.object_id = i.object_id)

where   database_id = db_id()

Приведенный выше сценарий был украден из комментария к http://blog.sqlauthority.com/2009/05/09/sql-server-find-last-date-time-updated-for-any-table/.

Вот небольшой сценарий, который перечислит все хранимые процедуры пользователя (т.е. те, которые не поставляются с SQL Server или не являются системными хранимыми процедурами) во всех базах данных на вашем экземпляре сервера:

CREATE TABLE #ProcTable (
    DbName sysname,
    ProcName sysname
)

DECLARE @command1 NVARCHAR(1000)

SET @command1 = 'USE [?];INSERT #ProcTable 
SELECT ''[?]'',Name
FROM sys.all_objects
WHERE TYPE=''p''
AND is_ms_shipped=0'

EXEC sp_msforeachdb @command1

SELECT * FROM #ProcTable 
ORDER BY DbName,ProcName

DROP TABLE #ProcTable 

Если вы не запускаете трассировку, которая фиксирует событие exec (и у вас нет запущенной трассировки по умолчанию), вам необходимо иметь механизм аудита на уровне приложения, чтобы фиксировать выполнение хранимых процедур. Если у вас нет ни одного из них, вы не сможете вернуться во времени, чтобы увидеть, когда процессы будут запущены.

Для этого нет встроенного журнала, поэтому вам нужно либо запустить трассировку на стороне сервера, либо настроить какой-то аудит для сбора этой информации.

Вы можете получить ограниченный ответ на этот вопрос, посмотрев на динамическое представление управления sys.dm_exec_procedure_stats, которое было введено в SQL Server 2008.

select
    DB_NAME(database_id) as "database_name" 
    , OBJECT_NAME(object_id, database_id) as "procedure_name"
    , last_execution_time
from 
    sys.dm_exec_procedure_stats

Для любых планов хранимых процедур, которые в кеше процедур, это сообщит вам время последнего выполнения. (В DMV есть еще много интересных столбцов.)

Эта информация не обязательно является полной: в лучшем случае она будет содержать информацию только с момента последнего запуска механизма базы данных (не сохраняется при перезапусках службы). Если хранимая процедура не была запущена с момента перезапуска сервера, она не будет присутствовать здесь. Очистка кеша плана приведет к сбросу этого DMV. Как и операции, которые очищают кэш планов как побочный эффект (например, изменение MAXDOP или параметров памяти) или иным образом делают недействительными кэшированные планы.

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