Подтвердить что ты не робот

Дата последнего запуска хранимой процедуры в SQL Server

Мы начинаем получать много хранимых процедур в нашем приложении. Многие из них предназначены для пользовательских отчетов, многие из которых больше не используются. Кто-нибудь знает о запросе, который мы могли бы выполнить в представлении системы в SQL Server 2005, который сообщил нам о последней дате, когда была выполнена хранимая процедура?

4b9b3361

Ответ 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 (хотя они показывают только историю с момента последнего перезапуска сервера), однако не используют это в одиночку.