2009-02-27 6 views
57

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

+2

Это большой вопрос. – NotMe

+2

У нас есть все наши журналы Sprocs, которые они называли. Все наши Sprocs имеют параметр для идентификатора сеанса, который входит в журнал (вместе с любой поднятой ошибкой и продолжительностью). Нам было удобно (до сих пор!) С накладными расходами, и это помогло с отладкой/отчетностью управления часто – Kristen

ответ

26

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

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

  1. Выполнить профайлер след, скажем, имя, сохраненное прок
  2. добавить строку каждый процедурный (создать Tabel конечно)
    • "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, то вы можете mine the RS database для запуска отчета, если вы можете сопоставить код для отчета DataSet.

Вы все равно не могли полагаться на DMV, потому что они перезагружены перезагрузкой SQL Server. Query cache/locks являются временными и не сохраняются в течение какого-либо периода времени.

40

Код ниже должен сделать трюк (> = 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 ниже.

+0

работает только на SQL 2008 и выше – Kodak

+0

+1 очень полезный скрипт, спасибо, небольшая коррекция, во второй строке, которую вы пропустили a 'e', ​​это должно быть 'a.last_execution_time', – AmmarR

+1

Спасибо и +1 за это. очень полезный DMV. Можем ли мы также получить входящие в процедуру параметры ввода? –

21

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

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

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

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

+1

Так было бы справедливо сказать, что если запись присутствует в запросе, предлагаемом @Pixelated, то последнее время выполнения является точным, но если запись отсутствует, вы не можете делать никаких предположений о ее последнем времени выполнения? –

+3

Приносим извинения за крайне поздний ответ. В последнее время я не был здесь. То, что вы указали выше, является правильным. –

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') 
0

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

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 
+2

формат – HaveNoDisplayName

5

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 

Это даст вам список недавно выполненных процедур.

Если вы хотите, чтобы проверить, если perticular хранимая процедура выполняется недавно

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 
Смежные вопросы