Я исправляю проблемы с производительностью хранимой процедуры с несколькими состояниями в SQL Server. Я хочу знать, на какие части я должен тратить время.
Я понимаю, как читать Query Cost, и всегда ли это процент? что даже когда SSMS предписано включить фактический план выполнения , показатели «Стоимость запроса (относительно пакета)» все еще основаны на оценочных значениях , которые могут быть далеки от фактических
Из измерения производительности запросов: «Стоимость запроса плана выполнения» и «Время, затраченное на выполнение» я понимаю, что я могу окружить вызов хранимой процедуры SET STATISTICS TIME
инструкциями, и тогда я получу такой список на Messages
панели:
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 1 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
[etc]
SQL Server Execution Times:
CPU time = 187 ms, elapsed time = 206 ms.
с одним выходным сообщением для каждого оператора.
Я могу «легко» (хотя и не удобно) связать вывод статистики времени с планами выполнения «оператор за оператором» на панели плана выполнения, посчитав их: четвертый SQL Server Execution Times
вывод сообщения соответствует на Query 4
панели плана выполнения и т. Д.
Но есть ли лучший способ?
Duration
иCPU
результаты являются фактическими, а не оценочными значениями, да?Один хороший способ сделать это с помощью Profiler. Установите «repro» вашего проблемного процесса на dev или test box, то есть пример вызова процесса с параметрами. Затем с помощью Profiler создайте трассировку, используя либо шаблон TSQL_SPs, либо из пустого шаблона добавьте событие SP: StmtCompleted. Добавьте столбцы Длительность, Чтение, Запись и ЦП, если они еще не доступны. Добавьте фильтр в трассировку вашего SPID (который вы должны знать из Management Studio). Вы также можете добавить фильтр к длительности (например, больше 1000 = больше 1 секунды).
Вы можете либо запустить трассировку в Профилировщике, хотя есть издержки (НЕ делайте этого на производственной коробке), либо экспортировать определение и создать трассировку на стороне сервера. Издержки Profiler не так важны для выделенного разработчика или тестового бокса.
Запустите процесс и дайте ему завершить. Вы также можете получить план фактического выполнения на данном этапе.
Остановите свою трассировку и откройте файл, и вы должны увидеть построчную разбивку вашего процесса, включая время для каждого шага. Я нахожу это более полезным, чем план по выявлению узких мест, хотя этот план пригодится при рассмотрении соответствующих разделов для настройки.
НТН
источник
Вы также можете использовать динамические административные представления sys.dm_exec_procedure_stats и sys.dm_exec_query_stats . Первый из них дает информацию о процедуре в целом; вторая может использоваться для разбивки каждого запроса в процедуре. Пример показан ниже:
Процедура статистики:
Запросы в рамках процедуры:
источник