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

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

Ответов (7)

Решение

Короче нет.

Однако есть «приятные» вещи, которые вы можете делать.

  1. Запустите трассировку профилировщика, скажем, с сохраненным именем процедуры
  2. Добавьте строку для каждого процесса (конечно, создайте табель)
    • " 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 для выполнения отчетов, если вы можете сопоставить код для отчета 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') 

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

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

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: Обратите внимание на совет Джеффа Моденса ниже. Если вы найдете здесь процедуру, можете быть уверены, что она точная. Если вы этого не сделаете, вы просто не знаете - вы не можете сделать вывод, что он не работает.