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



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

685   6  

6 ответов:

в двух словах, нет.

, есть "хорошие" вещи, которые вы можете сделать.
  1. запустите трассировку профилировщика, например, с сохраненным именем proc
  2. добавить строку каждый proc (создать табель, конечно)
    • "INSERT dbo.SPCall (What, When) VALUES (OBJECT_NAME(@@PROCID), GETDATE()"
  3. продлить 2 с продолжительностью тоже

есть "забавные" вещи, которые вы можете сделать:

  1. удалите его, посмотрите, кто звонит
  2. удалить права, смотрите кто звонит
  3. добавить RAISERROR ('Warning: pwn3d: call admin', 16, 1), смотрите, кто звонит
  4. добавить WAITFOR DELAY '00:01:00', смотрите, кто звонит

вы поняли идею. Испытанный и проверенный метод "смотрите, кто вызывает" ИТ-поддержки.

Если отчеты являются службами Reporting Services, то вы можете моя база данных RS для отчета выполняется, если вы можете сопоставить код с набором данных отчета.

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

ниже код должен сделать трюк (>=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 : Пожалуйста, примите к сведению советы Джефф Modens ниже.

О, теперь будьте осторожны! Все, что блестит-это не золото! Все" статистические " представления и функции dm имеют проблему для этого типа вещей. Они работают только против того, что находится в кэше, и время жизни того, что находится в кэше, может быть измерено в минутах. Если бы вы использовали такую вещь, чтобы определить, какие SPs являются кандидатами на удаление, вы могли бы быть в мире боли, когда вы удаляете SPs, которые были использованы всего несколько минут назад.

следующие выдержки из книг онлайн для данный вид ДМ...

sys. dm_exec_procedure_stats Возвращает суммарную статистику производительности для кэшированных хранимых процедур. Представление содержит по одной строке на хранимую процедуру, и время жизни строки составляет столько, сколько хранимая процедура остается в кэше. Когда хранимая процедура удаляется из кэша, соответствующая строка удаляется из этого представления.

sys. dm_exec_query_stats Представление содержит по одной строке на инструкцию запроса в кэшированном плане и время жизни объекта строки привязаны к самому плану. Когда план удаляется из кэша, соответствующие строки удаляются из этого представления.

Сыс.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  

Это прекрасно работает на 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') 

Я использую этот:

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

Comments

    Ничего не найдено.