2015-02-07 3 views
0

Требование:Подсчет количества раз процедура выполняется

Чтобы подсчитать, сколько раз процедура исполненных

Из того, что я понимаю, до сих пор, sys.dm_exec_procedure_stats можно использовать для приближенного подсчета, но это только с момента последнего перезапуска службы. Я нашел это link on this website релевантным, но мне нужно подсчитать, чтобы быть точным, и это не должно стираться после перезапуска службы.

Могу ли я указать на это указатели, пожалуйста?

Hack: процедура, которую мне нужно отслеживать, имеет инструкцию select, поэтому возвращает некоторые строки, которые хранятся в постоянной таблице с именем Results. Самое простое решение, о котором я могу думать, - создать столбец в таблице Results, чтобы отслеживать выполнение процедуры, выберите максимальное значение из этого столбца перед вставкой и добавьте его к нему, чтобы увеличить счет. Это решение кажется мне слишком глупым, но лучшее, что я мог придумать.

+0

Можете вы изменить SProc? – Richard

+0

@ Рихард: Да, могу. – Simran

+0

Данные в dm_exec_procedure_stats исчезают еще быстрее, когда план отбрасывается из кеша. –

ответ

1

Как я думал, вы можете создать объект последовательности, если вы на SQL Server 2012 или новее.

CREATE SEQUENCE ProcXXXCounter 
    AS int 
    START WITH 1 
    INCREMENT BY 1 ; 

А потом в процедуре извлечения значения из него:

declare @CallCount int 

select @CallCount = NEXT VALUE FOR ProcXXXCounter 

Существует, конечно, небольшие накладные расходы с этим, но не вызывает подобную проблему блокировки, что может произойти с использованием таблицы потому что последовательности обрабатываются вне транзакции.

параметры последовательности: https://msdn.microsoft.com/en-us/library/ff878091.aspx

+1

Только avilable в 2012 и более поздних версий, также, если процесс будет отменен, число будет увеличено и покажет вам неправильное количество исполнений. –

+0

@JamesZ: Большое спасибо Джеймсу. Это похоже на то, что я хотел. Благодаря тонну. – Simran

1

Единственный способ, которым я могу думать о том, чтобы отслеживать количество исполнений, даже когда служба перезапустилась, состоит в том, чтобы иметь таблицу в вашей базе данных и вставлять строку в эту таблицу внутри вашей процедуры каждый раз, когда она выполняется.

Возможно, добавьте столбец datetime, чтобы собрать дополнительную информацию об исполнении. И столбец для пользователя, который выполнил и т. Д.

+0

Спасибо.Да, вид взлома, о котором я упоминал выше, несколько одинаков, но на самом деле с нетерпением жду более аккуратного способа для этого :) – Simran

+0

Мне кажется, это довольно аккуратно :) Не думаю, что у вас есть много вариантов с вашим требованием :) –

1

Это может быть сделано, легко и без Enterprise Edition, с помощью расширенных событий. Событие sqlserver.module_end будет срабатывать, правильно настроить предикаты и использовать цель гистограммы.

http://sqlperformance.com/2014/06/extended-events/predicate-order-matters https://technet.microsoft.com/en-us/library/ff878023(v=sql.110).aspx

потреблять значение, запрос к цели гистограммы (под рассматривающими примерами целевых выходных).

+0

Спасибо за ваш вклад. :) Это выглядит интересно, но я довольно новичок с этим. Извините за нобе, но могу ли я получить более основную должность для начала? Благодарю. – Simran

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