В моей предыдущей статье я отображал метрики из записанного SQL profiler trace на листинг stored процедуры. Это идеально подходит для тестовых окружений, но в production надо быть осторожным, и запись «частых» событий могут увеличивать CPU сервера и замедлять его работу.
@speshuric предложил использовать данные из Query Store. Там, правда, нет номеров строк. Но можно выкрутиться, так как есть смещения и можно посчитать количество переводов строки до смещения. Итак, сказано — сделано!
Подготовка
Здесь мы работаем непосредственно на сервере. Поэтому я писал код на PowerShell, потому что он гарантированно есть на сервере. В репозитории https://github.com/tzimie/sqlpig скачиваем файл querypig.ps1.
Запуск
Запускаем скрипт на сервере:
powershell .\querypig.ps1 server database procedure [flags]
-
server — имя сервера. Подразумевается integrated seciurity
-
database — имя базы данных
-
procedure — имя процедуры, можно указывать схему (подходит все, что понимает встроенная функция object_id)
-
флаги (не обязательно) — размер табуляции (текст преобразуется в html и надо знать, во сколько пробелов превращать табуляцию, по умолчанию 4) и флаг P говорит о том, что надо сохранять планы. Например,
-
2 — табуляция два пробела, планы не собираются
-
P3, 3P — три пробела и планы собираются
-
P — планы собираются (4 проблема по умолчанию)
-
Результат
Программа создаст html файл c тем же именем, что и имя процедуры. Очень наивный код делает нечто, что можно назвать подсветкой синтаксиса. Я не хотел тратить на это время, поэтому не поддерживаются вложенные комментарии и прочие более менее сложные случаи.
Строки, к которым нашлись ассоциированные метрики из Query Store показывают tooltip со всей информацией:

Если заказана генерация планов, то создается каталог с именем, совпадающим с именем процедуры, и в нем создаются файлы вида plan<номерстроки>.sqlplan:

соответствующие номерам строк листинга. Вы можете посмотреть их с помощью SSMS.
Когда лучше использовать первый способ, а когда — второй?
На production лучше использовать querypig. Влияния на сервер нет, но есть и минусы — вы не можете спрофилировать определенное выполнение, и видите только агрегированные данные. Кроме того, query store ограничен по объему, и содержит не все запросы. Поэтому информация может быть неполной и ‘не биться’ к 100%, к общему числу запросов и друг с другом (записи в Query store могут вытесняться и устаревать)
Использование SQL profiler с sqlpig дает гарантированное и полное покрытие кода, и вы можете контролировать параметры запуска и время сбора данных. Но на production событие SP:StmtComplete может слишком часто возникать, и его фильтрация может приводить к повышенному CPU и к замедлению сервера.
ссылка на оригинал статьи https://habr.com/ru/articles/901066/
Добавить комментарий