Дата последнего запуска хранимой процедуры в SQL Server - PullRequest
67 голосов
/ 27 февраля 2009

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

Ответы [ 8 ]

44 голосов
/ 29 марта 2011

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

31 голосов
/ 27 февраля 2009

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

Однако, есть "хорошие" вещи, которые вы можете сделать.

  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 для отчетов, если вы можете сопоставить код для набора данных.

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

25 голосов
/ 22 ноября 2012

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

Следующие выдержки взяты из Books Online для данных просмотров dm…

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

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

6 голосов
/ 04 апреля 2017

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  
1 голос
/ 29 марта 2019

Если вы включили Query Store на 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 
1 голос
/ 30 марта 2015

Это нормально работает в 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') 
0 голосов
/ 07 декабря 2018

Вам также следует остерегаться любых хранимых процедур или объектов, которые являются «только периодически», например, SP, работающий близко к EOFY, может быть жизненно важным - то, что он не запускался почти год, не означает не требуется Конечно, в качестве руководства используйте DMV (хотя они показывают историю только после последнего перезапуска сервера), но не используйте это в одиночку.

0 голосов
/ 31 июля 2015

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...