1

Я создал таблицу отслеживаемых хранимых процедур в наших базах данных, надеясь использовать ее для очистки процедур, которые мы больше не используем. Я установил это несколько месяцев назад, и теперь я готов начать очищение. В таблицах используются sys.procedures и sys.dm_exec_procedure_stats DMVs в SQL Server 2008 R2, и задание обновляет статическую таблицу каждые 10 минут, 24 часа в деньОтслеживание хранимой процедуры

Я просматривал список своих процедур и встречал пару, которые я знаю, что факт был запущен совсем недавно. Тот, который я нашел, запускается как шаг 2 задания, но sys.dm_exec_procedure_stats, похоже, не содержит никакой записи о его запуске, но процедура на шаге 1 появилась в правильное время. Я проверил историю заданий, и оба шага 1 и 2 работали без проблем.

Единственное различие, которое я вижу, состоит в том, что процедура на шаге 2 включает в себя «Предупреждение: нулевое значение исключается агрегированием или другой операцией SET», тогда как первый шаг не выполняется. Означает ли это, имеет значение, будет ли процедура появляться в sys.dm_exec_procedure_stats?

Надеюсь, кто-то может помочь!

+0

Дубликат [Last Run Дата на хранимая процедура в MS SQL] (http://stackoverflow.com/questions/595742/last-run-date-on-a-stored-procedure-in-ms-sql) –

+0

Я не верю, что это дубликат вопрос, так как другой вопрос - как отслеживать, тогда как я уже отслеживаю. Проблема в том, что в таблице sys.dm_exec_procedure_stats есть процедура, которая не отображается, и связано ли это с предупреждением NULL. Спасибо –

ответ

0

Хотя причина, по которой он не появляется в DMV, вероятно, является причиной, указанной в связанном/связанном ответе, упомянутом @ bastos.sergio, в комментарии по этому вопросу, который все еще оставляет проблему «что может сделать, чтобы найти procs, которые не используются? ».

Принятый ответ на этот вопрос, связанный (это вопрос на который ссылается @ bastos.sergio: Last Run Date on a Stored Procedure in SQL Server) отсутствует что-то, поэтому я добавить к нему здесь:

ТОЛЬКО способ узнать, что звонит это:

  • сканирование всего код (приложение коды, другой Хранимый Procs, Steps Работы [в msdb.dbo.sysjobsteps], файлы определение отчетов SSRS и т.д.) для ссылок
  • Если вы позволяете специальный доступ (например, кто-то ссылался на хранимую программу в Ac сесс приложению [или любой Microsoft Office «приложение»]), то вам нужно сделать некоторые из дополнительных шагов, указанных в принятом ответе этого связанный вопроса, а именно:
    • Добавить RAISERROR(N'Deprecated! Please contact YourName.', 16, 1); RETURN; в верхней части ргоса и оставить его там на месяц или два.
    • Добавить таблицу для регистрации вызовов proc и INSERT в эту таблицу журналов вверху любого из предполагаемых устаревших кодов и проверить один раз в неделю, чтобы увидеть, что-нибудь появилось. Если вы также выполняете RAISERROR, поставьте INSERT до RAISERROR(...); RETURN;.
    • Что касается доступа ad hoc (то есть доступа за пределами кода, который вы контролируете), будьте осторожны, чтобы всегда иметь в виду, что нечетный доступ может быть только таким: нечастым. Если есть путь к коду, который выполняется ежемесячно, ежеквартально, раз в два года, ежегодно, когда какой-то менеджер помнит, чтобы запрашивать такой-то отчет и т. Д., Тогда вы могли бы удалить действительный код, если не позволяете достаточно долго чтобы зафиксировать «очень» редкое использование (и именно поэтому, даже если данные DMV были более надежными, вам все равно нужно быть осторожными).
    • Опять же, если весь доступ находится внутри кода, который вы контролируете, просто отсканируйте свой код (скорее всего, с помощью регулярных выражений).

EDIT:
Для ответа на конкретный вопрос:

ли «Предупреждение: Нулевое значение устраняется агрегате или другой операции SET» предупреждает, что в запросе, работающий в Stored Proc, который не отображается в DMV, имеет какое-то отношение к тому, почему он не появляется в DMV?

сделать следующий тест:

CREATE PROCEDURE #NoWarning 
AS 
SELECT AVG(tmp.col) 
FROM (
    SELECT 1.0 
    UNION ALL 
    SELECT 2 
    ) tmp(col); 
GO 

EXEC#NoWarning; 
GO 

CREATE PROCEDURE #Warning 
AS 
SELECT AVG(tmp.col) 
FROM (
    SELECT 1.0 
    UNION ALL 
    SELECT null 
    ) tmp(col); 
GO 

EXEC#Warning; 

И затем выполнить следующий запрос, и вы должны увидеть оба имени Учеб появляться в "данных TempDb":

SELECT DB_NAME(ps.database_id) AS [DatabaseName], 
     OBJECT_NAME(ps.[object_id], ps.database_id) AS [ProcName], 
     * 
FROM sys.dm_exec_procedure_stats ps 
ORDER BY [DatabaseName], [ProcName]; 
+0

Весь код запускается либо с помощью заданий, либо с помощью служб Reporting Services. Большинство процедур идут в таблицу, а те, которые я не проверил, и они больше не работают, поэтому я доволен этим. Эта процедура является той, которую я знаю, которая выполняется еженедельно, но не отображается в таблице. Возможно ли, что как только код завершится, он будет удален из кеша? –

+0

@ChrisUpton: да, это возможно. Я очень сомневаюсь, что предупреждение ANSI помешало бы ему быть зарегистрированным в первую очередь. Вы протестировали, запустив SQL Job и немедленно проверив SSMS, чтобы узнать, находится ли она в DMV? Это может быть только на несколько секунд? –

+0

Я запустил код вручную, и он, похоже, вообще не регистрируется - даже как только он будет выполнен !. Будет ли он регистрировать кеш в отдельной базе данных, а не в той, на которой запущена процедура? –

Смежные вопросы