Дата останнього запуску збереженої процедури в SQL Server


77

Ми починаємо отримувати багато збережених процедур у нашому додатку. Багато з них призначені для спеціальних звітів, багато з яких більше не використовуються. Хтось знає про запит, який ми могли б запустити в системних поданнях у SQL Server 2005, який повідомляв би нам останню дату виконання збереженої процедури?


2
У нас є всі наші журнали Sprocs, які вони називались. Усі наші Sprocs мають параметр для ідентифікатора сеансу, який включений до журналу (разом із помилками та тривалістю). Нам було зручно (поки що!) З накладними витратами, і це допомагало часто налагоджувати / звітувати про управління
Крістен

Відповіді:


36

У двох словах, ні.

Однак є і «приємні» речі, які ви можете зробити.

  1. Запустіть трасування профілю з, скажімо, збереженою назвою proc
  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', подивіться, хто телефонує

Ви зрозуміли ідею. Перевірений метод ІТ-підтримки "подивись, хто дзвонить".

Якщо звіти є службами звітування, ви можете виконувати базу даних RS для запуску звітів, якщо ви можете збігати код із звітом DataSet.

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


Я вперше використав функцію "подивись, хто телефонує", щоб знайти додаткові порти на контролері терміналу.
Кріс Катіньяні,

50

Наведений нижче код повинен зробити трюк (> = 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: Зверніть увагу на пораду Джеффа Моденса нижче. Якщо ви знайдете тут процедуру, ви можете бути впевнені, що вона є точною. Якщо ви цього не зробите, ви просто не знаєте - ви не можете зробити висновок, що він не працює.


Поставити +1 дуже корисному сценарію, дякую, невеличка виправка, у другому рядку ви пропустили "е", це повинно бути a.last_execution_time,
AmmarR

1
Дякую та +1 за це. дуже корисний DMV. чи можемо ми також отримати введені параметри вхідних параметрів?
Neeraj Prasad Sharma

3
Приємно. Я припускаю, що до цього WHERE DB_NAME(ps.database_id) = ''ми повинні заповнити пробіл з назвою нашої бази даних.
Баодад,

Він не відображає всі збережені процедури, показує лише останню

30

О, будь обережний зараз! Не все, що блищить - золото! Всі "статистика" подань та функцій dm мають проблеми для такого типу речей. Вони працюють лише проти того, що знаходиться в кеші, і термін служби того, що знаходиться в кеші, можна виміряти хвилинами. Якби ви використовували таку річ, щоб визначити, які ІП є кандидатами на відмову, ви можете зіткнутися зі світом болю, видаливши ІП, які використовувались кілька хвилин тому.

Наведені нижче уривки подані з Books Online для поданих dm-переглядів ...

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

sys.dm_exec_query_stats Представлення містить один рядок на оператор запиту в кешованому плані, а час життя рядків прив'язаний до самого плану. Коли план видаляється з кешу, відповідні рядки видаляються з цього подання.


3
Тож було б справедливим сказати, що якщо запис присутній у запиті, запропонованому @Pixelated, тоді останній час виконання є точним, але якщо запис відсутній, ви не можете робити припущень про час його останнього виконання?
Сер Криспалот,

6
Прошу вибачення за надзвичайно пізню відповідь. Останнім часом я тут не багато бував. Те, що ви зазначили вище, є правильним.
Jeff Moden

8

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  

4

Якщо ви ввімкнули 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

Це добре працює у 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') 

1

Я використовую це:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.