Дата последнего выполнения хранимой процедуры в SQL Server
Мы начали получать много хранимых процедур в нашем приложении. Многие из них предназначены для пользовательских отчетов, многие из которых больше не используются. Кто-нибудь знает о запросе, который мы могли бы запустить в системных представлениях в SQL Server 2005, который сообщал бы нам последнюю дату выполнения хранимой процедуры?
Ответов (7)7
Короче нет.
Однако есть «приятные» вещи, которые вы можете делать.
- Запустите трассировку профилировщика, скажем, с сохраненным именем процедуры
- Добавьте строку для каждого процесса (конечно, создайте табель)
- "
INSERT dbo.SPCall (What, When) VALUES (OBJECT_NAME(@@PROCID), GETDATE()
"
- "
- Продлить 2 с продолжительностью тоже
Вы можете делать "забавные" вещи:
- Убери его, посмотри, кто звонит
- Снимаем права, смотрим кто звонит
- Добавь
RAISERROR ('Warning: pwn3d: call admin', 16, 1)
, посмотри, кто звонит - Добавь
WAITFOR DELAY '00:01:00'
, посмотри, кто звонит
Вы уловили идею. Проверенный на практике метод ИТ-поддержки «посмотри, кто звонит».
Если отчеты относятся к службам Reporting Services, вы можете использовать базу данных RS для выполнения отчетов, если вы можете сопоставить код для отчета DataSet.
В любом случае нельзя полагаться на DMV, потому что они сбрасываются при перезапуске SQL Server. Кэш / блокировки запросов являются временными и не сохраняются в течение длительного времени.
Ой, будь осторожен! Все, что блестит, не золото! У всех dm-представлений и функций «stats» есть проблемы для такого рода вещей. Они работают только с тем, что находится в кеше, и время жизни того, что находится в кеше, можно измерить в минутах. Если бы вы использовали такую вещь, чтобы определить, какие SP являются кандидатами на удаление, вы могли бы столкнуться с серьезными проблемами при удалении SP, которые использовались всего несколько минут назад.
Следующие выдержки взяты из электронной документации для данных просмотров dm ...
sys.dm_exec_procedure_stats Возвращает совокупную статистику производительности для кэшированных хранимых процедур. Представление содержит по одной строке на хранимую процедуру, и время существования строки составляет до тех пор, пока хранимая процедура остается кэшированной. Когда хранимая процедура удаляется из кеша, соответствующая строка удаляется из этого представления.
sys.dm_exec_query_stats Представление содержит одну строку для каждого оператора запроса в кэшированном плане, а время жизни строк привязано к самому плану. Когда план удаляется из кеша, соответствующие строки удаляются из этого представления.
Это отлично работает в 2005 году (если план находится в кеше)
USE YourDb;
SELECT qt.[text] AS [SP Name],
qs.last_execution_time,
qs.execution_count AS [Execution Count]
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
WHERE qt.dbid = DB_ID()
AND objectid = OBJECT_ID('YourProc')
sys.dm_exec_procedure_stats содержит информацию о функциях выполнения, ограничениях, процедурах и т. д. Но время жизни строки имеет ограничение. В момент удаления плана выполнения из кеша запись исчезнет.
Use [yourDatabaseName]
GO
SELECT
SCHEMA_NAME(sysobject.schema_id),
OBJECT_NAME(stats.object_id),
stats.last_execution_time
FROM
sys.dm_exec_procedure_stats stats
INNER JOIN sys.objects sysobject ON sysobject.object_id = stats.object_id
WHERE
sysobject.type = 'P'
ORDER BY
stats.last_execution_time DESC
Это даст вам список недавно выполненных процедур.
Если вы хотите проверить, выполнялась ли недавно определенная хранимая процедура
SELECT
SCHEMA_NAME(sysobject.schema_id),
OBJECT_NAME(stats.object_id),
stats.last_execution_time
FROM
sys.dm_exec_procedure_stats stats
INNER JOIN sys.objects sysobject ON sysobject.object_id = stats.object_id
WHERE
sysobject.type = 'P'
and (sysobject.object_id = object_id('schemaname.procedurename')
OR sysobject.name = 'procedurename')
ORDER BY
stats.last_execution_time DESC
Если вы включили хранилище запросов в SQL Server 2016 или новее, вы можете использовать следующий запрос, чтобы получить последнее выполнение SP. История зависит от конфигурации хранилища запросов.
SELECT
ObjectName = '[' + s.name + '].[' + o.Name + ']'
, LastModificationDate = MAX(o.modify_date)
, LastExecutionTime = MAX(q.last_execution_time)
FROM sys.query_store_query q
INNER JOIN sys.objects o
ON q.object_id = o.object_id
INNER JOIN sys.schemas s
ON o.schema_id = s.schema_id
WHERE o.type IN ('P')
GROUP BY o.name , + s.name
Приведенный ниже код должен помочь (> = 2008)
SELECT o.name,
ps.last_execution_time
FROM sys.dm_exec_procedure_stats ps
INNER JOIN
sys.objects o
ON ps.object_id = o.object_id
WHERE DB_NAME(ps.database_id) = ''
ORDER BY
ps.last_execution_time DESC
Изменить 1: Обратите внимание на совет Джеффа Моденса ниже. Если вы найдете здесь процедуру, можете быть уверены, что она точная. Если вы этого не сделаете, вы просто не знаете - вы не можете сделать вывод, что он не работает.