Как профилировать хранимые процедуры

26

Я использую SQL Server 2012 и мне было интересно, как профилировать хранимые процедуры

Например, может ли профилировщик захватить каждый отдельный оператор SQL в хранимой процедуре, что это такое, и сколько времени требуется для выполнения и т. Д.?

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

Питер
источник

Ответы:

27

Ответ Кевина описывает, какие события нужно захватить в SQL Trace / SQL Profiler. Если немного расширить этот ответ - SP:StmtCompletedпокажет вам, как каждое утверждение в хранимой процедуре завершается, как это звучит.

Также, если вы заняты системой и пытаетесь диагностировать проблему производительности, вам следует быть осторожным с SQL Profiler. SQL Profiler намного медленнее, чем трассировка в файл или использование расширенных событий. Это сообщение в блоге Джонатана Кехайяса показывает примерно 90% накладных расходов на производительность системы при использовании SQL Profiler и около 10% накладных расходов при трассировке в файл. Меньше для расширенных событий. Вот почему обычно не рекомендуется запускать сам SQL Profiler, пока

Хотя эта информация доступна через расширенные события, я бы по-прежнему предлагал использовать SQL Trace (технологию, лежащую в основе SQL Profiler), но вместо этого использовать трассировку в файл.(если вы хотите инвестировать в изучение и использование расширенных событий, это будет путь, в будущей версии SQL Server SQL Trace не будет, и все, что у нас будет - это расширенные события). Я бы также предложил вам отфильтровать через кнопку «Фильтры столбцов» как можно больше фонового шума, чтобы убедиться, что вы захватываете только то, что необходимо. Вы можете настроить трассировку с помощью инструмента Profiler, используя шаги, которые Кевин описывает в своем хорошем ответе, а затем добавить фильтр из того же графического интерфейса. Затем вы можете экспортировать трассировку в виде скрипта и запустить этот скрипт на трассировке SQL Server в файл в папке, которая не содержит файлов базы данных или журнала транзакций. Чтобы экспортировать, вы просто должны настроить свою трассировку, запустить ее на несколько секунд, чтобы убедиться, что вы захватываете то, что хотите, остановить, а затем перейти к строке меню и File->Export-> Script Trace Definitionи сохраните файл. Затем откройте этот файл в новом окне запроса на сервере, который вы собираетесь отслеживать. Вы можете узнать больше об опциях и определениях этого скрипта, который вы создали, посмотрев справочные статьи для различных хранимых процедур, используемых в этом скрипте, который вы только что создали, начиная здесь .

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

Майк Уолш
источник
2
Как насчет того, когда SP: StmtCompleted просто показывает «- зашифрованный текст» в тексте запроса? Как мы можем узнать, к каким таблицам обращаются?
Brain2000
Возникла та же проблема, что и у вас @ Brain2000 ....
Венццель
21

Вы можете захватить отдельные операторы в хранимой процедуре через SQL Server Profiler. Для этого на вкладке «Выбор событий» установите флажок «Показать все события». Затем прокрутите вниз до категории «Хранимые процедуры» и установите флажок « SP: StmtCompleted» . Если у вас также выбраны события SQL: BatchStarted и SQL: BatchCompleted , вы можете получить от начала до конца картину выполнения хранимой процедуры, связав все это вместе с помощью SPID.

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

SELECT 
    OBJECT_NAME(st.objectid,st.dbid) AS ObjectName,
    cp.usecounts AS ExecutionCount,
    st.TEXT AS QueryText,
    qp.query_plan AS QueryPlan
FROM 
    sys.dm_exec_cached_plans AS cp
    CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp
    CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
WHERE 
    cp.objtype = 'Proc'
    AND OBJECT_NAME(st.objectid,st.dbid) = 'YourStoredProcedure';
Кевин Физель
источник