Як профілювати збережені процедури


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 ....
wenzzzel

21

Ви можете захоплювати окремі оператори у збереженій процедурі через Profiler SQL Server. Для цього на вкладці Вибір подій натисніть прапорець "Показати всі події". Потім прокрутіть униз до категорії «Збережені процедури» та поставте прапорець біля пункту 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';
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.