MSSQL: рисуем метрики из Query Store на листинге процедуры

В моей предыдущей статье я отображал метрики из записанного SQL profiler trace на листинг stored процедуры. Это идеально подходит для тестовых окружений, но в production надо быть осторожным, и запись "частых" событий могут увеличивать CPU сервера и замедлять его работу.

@speshuric предложил использовать данные из Query Store. Там, правда, нет номеров строк. Но можно выкрутиться, так как есть смещения и можно посчитать количество переводов строки до смещения. Итак, сказано - сделано!

Подготовка

Здесь мы работаем непосредственно на сервере. Поэтому я писал код на PowerShell, потому что он гарантированно есть на сервере. В репозитории https://github.com/tzimie/sqlpig скачиваем файл querypig.ps1.

Запуск

Запускаем скрипт на сервере:

powershell .\querypig.ps1 server database procedure [flags]

Результат

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

Строки, к которым нашлись ассоциированные метрики из Query Store показывают tooltip со всей информацией:

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

соответствующие номерам строк листинга. Вы можете посмотреть их с помощью SSMS.

Когда лучше использовать первый способ, а когда - второй?

На production лучше использовать querypig. Влияния на сервер нет, но есть и минусы - вы не можете спрофилировать определенное выполнение, и видите только агрегированные данные. Кроме того, query store ограничен по объему, и содержит не все запросы. Поэтому информация может быть неполной и 'не биться' к 100%, к общему числу запросов и друг с другом (записи в Query store могут вытесняться и устаревать)

Использование SQL profiler с sqlpig дает гарантированное и полное покрытие кода, и вы можете контролировать параметры запуска и время сбора данных. Но на production событие SP:StmtComplete может слишком часто возникать, и его фильтрация может приводить к повышенному CPU и к замедлению сервера.

@Tzimie
15.04.2025 23:00 UTC
Первоисточник

Комментарии

@speshuric
16.04.2025 06:22 UTC
+1

А ситуация нескольких планов к одной строке как обрабатывается? Один из важных плюсов QS - он умеет показывать, какие разные планы были по выражению.

@Tzimie
16.04.2025 06:47 UTC
+1

Он берет последний по дате. С переключающимися не вовремя планами у меня есть отдельный отчёт и отдельная борьба