Мы начинаем получать много хранимых процедур в нашем приложении. Многие из них предназначены для пользовательских отчетов, многие из которых больше не используются. Кто-нибудь знает о запросе, который мы могли бы выполнить в представлении системы в SQL Server 2005, который сообщил нам о последней дате, когда была выполнена хранимая процедура?
Дата последнего запуска хранимой процедуры в SQL Server
Ответ 1
В двух словах, нет.
Однако есть "хорошие" вещи, которые вы можете сделать.
- Запустите трассировку профайлера с, скажем, сохраненным именем proc
- Добавьте строку в каждую proc (создайте вкладку, конечно)
- "
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 reset om. Query cache/locks являются временными и не сохраняются в течение какого-либо периода времени.
Ответ 2
В приведенном ниже коде должен быть трюк ( >= 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: Пожалуйста, обратите внимание на приведенный ниже совет Джеффа Моденса.
Ответ 3
О, будь осторожен! Все, что блестит, не золото! Все представления и функции "stats" dm имеют проблему для этого типа вещей. Они работают только против того, что находится в кеше, и время жизни того, что находится в кеше, может измеряться в считанные минуты. Если бы вы использовали такую вещь, чтобы определить, какие SP-кандидаты являются кандидатами на отброс, вы можете оказаться в мире обид, когда вы удаляете SP, которые использовались всего несколько минут назад.
Следующие отрывки из Книги Онлайн для данных просмотров dm...
sys.dm_exec_procedure_stats Возвращает совокупную статистику производительности для хранимых в кэше процедур. Представление содержит одну строку для каждой хранимой процедуры, а время жизни строки до тех пор, пока хранимая процедура остается кешированной. Когда хранимая процедура удаляется из кэша, соответствующая строка исключается из этого представления.
sys.dm_exec_query_stats Представление содержит одну строку для каждого запроса в кэшированном плане, а время жизни строк привязывается к самому плану. Когда план удаляется из кеша, соответствующие строки удаляются из этого представления.
Ответ 4
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
Ответ 5
Это отлично работает в 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')
Ответ 6
Я использую это:
use YourDB;
SELECT
object_name(object_id),
last_execution_time,
last_elapsed_time,
execution_count
FROM
sys.dm_exec_procedure_stats ps
where
lower(object_name(object_id)) like 'Appl-Name%'
order by 1
Ответ 7
Вы также должны быть осторожны с любыми хранимыми процессами или объектами, которые только "периодически", например, SP, который близок к EOFY, может быть жизненно важным - только потому, что он не запускался почти через год, это не значит, что это не требуется. Разумеется, в качестве руководства используйте DMV (хотя они показывают только историю с момента последнего перезапуска сервера), однако не используют это в одиночку.