powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Узнать где тормозит в хранимой процедуре.
14 сообщений из 14, страница 1 из 1
Узнать где тормозит в хранимой процедуре.
    #39919322
dartaen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня.

Не бейте ногами, только начинаю администрировать SQL и не прошу готового решения, а только лишь направления.

Есть в базе хранимая процедура, она довольно кустисто написана и в целом к ней вопросов нет, но иногда 1-4 раза в сутки она начинает выполняться 3-7 минут. Разработчики клянутся, что дело в сервере и процедура не должна столько в принципе выполняться. Я перфмоном проверил - в моменты "залипа" сервер совсем ничем не занят, дисковых очередей 0, проц занят на 2-5%%, в ЕвентЛоге - пустота.. т.е. с точки зрения ОС - вопросов нет. Я включил на базе Query Store и только один запрос из процедуры в топ10 на 3м месте, причём Duration едва ли 35% от топ1.

Суть вопроса - как можно выцепить какой-либо автоматикой (ЕЕ, Профайлер) на чём конкретно эта процедура изредка "залипает"?
...
Рейтинг: 0 / 0
Узнать где тормозит в хранимой процедуре.
    #39919351
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dartaen
Я перфмоном проверил - в моменты "залипа" сервер совсем ничем не занят, дисковых очередей 0, проц занят на 2-5%%, в ЕвентЛоге - пустота.. т.е. с точки зрения ОС - вопросов нет.
Нужно посмотреть, во время "залипа", какие блокировки на сервере, не держит ли кто нибудь процедуру.
И ещё нужно посмотреть, какой стейтмент в процедуре в этот момент выполняется.

Это можно сделать процедурой sp_whoisactive.
Взять её можно отсюда: http://whoisactive.com/downloads/

И, соответственно, потом решать проблемы либо с блокировками, либо с планом запроса.
...
Рейтинг: 0 / 0
Узнать где тормозит в хранимой процедуре.
    #39919365
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dartaen,

причин множество, некоторые приводят к формированию неоптимального плана запроса, некоторые технического характера, ожидание постановки блокировки, расширение файлов базы и журналов. Может подтормаживать при резервном копировании.
...
Рейтинг: 0 / 0
Узнать где тормозит в хранимой процедуре.
    #39919367
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-нибудь в процедуре пояаился nested loop...
...
Рейтинг: 0 / 0
Узнать где тормозит в хранимой процедуре.
    #39919594
Гулин Федор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может помочь
REcomplile
но может и Повредить ибо будут затраты на рекомпиляцию каждый раз
это такой совет опасный - можно попробовать на тестовом окружении если есть
...
Рейтинг: 0 / 0
Узнать где тормозит в хранимой процедуре.
    #39919600
dartaen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg
Нужно посмотреть, во время "залипа", какие блокировки на сервере, не держит ли кто нибудь процедуру.
И ещё нужно посмотреть, какой стейтмент в процедуре в этот момент выполняется.

Это можно сделать процедурой sp_whoisactive.
Взять её можно отсюда: http://whoisactive.com/downloads/

И, соответственно, потом решать проблемы либо с блокировками, либо с планом запроса.

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

Владислав Колосов
dartaen,
причин множество, некоторые приводят к формированию неоптимального плана запроса, некоторые технического характера, ожидание постановки блокировки, расширение файлов базы и журналов. Может подтормаживать при резервном копировании.

Я проверял, бэкап не делается в это время. Я понимаю что что-то идёт не так, вопрос в том, как попытаться найти в чём проблема..

Гулин Федор
может помочь
REcomplile
но может и Повредить ибо будут затраты на рекомпиляцию каждый раз
это такой совет опасный - можно попробовать на тестовом окружении если есть

Предлагаете для всех запросов в процедуре (а их там пачечка) использовать эту опцию? Не очень разумное решение, как мне кажется, ведь потом это может аукнуться и даже не в одном запросе сразу..
...
Рейтинг: 0 / 0
Узнать где тормозит в хранимой процедуре.
    #39919608
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dartaen
alexeyvg
Это можно сделать процедурой sp_whoisactive.
Взять её можно отсюда: http://whoisactive.com/downloads/

И, соответственно, потом решать проблемы либо с блокировками, либо с планом запроса.

Это я уже скачал и поставил. Проблема в том, что я не могу поймать. Плюс я пробовал тестить на других процедурах и запрос постоянно меняется - как узнать что оно именно на нём стоит? Ведь если я буду постоянно обновляьт чтобы понять - меняется запрос или нет, я не могу качественно и быстро на глаз определить что этот запрос уже какое-то время "задержался"..
А, я думал, это не проблема, раз вы писали, что что то делали во время "зависания" процедуры.

Можно написать скриптик, который будет определять длительное время работы этой процедуры, и, если она "зависла", запускать sp_whoisactive с записью результатов в таблицу.
...
Рейтинг: 0 / 0
Узнать где тормозит в хранимой процедуре.
    #39919609
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dartaen
Я понимаю что что-то идёт не так, вопрос в том, как попытаться найти в чём проблема..
А есть какая то корреляция между параметрами и временем работы? Может, запустить профайлер с фильтром по имени этой процедуры, и потом поанализировать трассу.
...
Рейтинг: 0 / 0
Узнать где тормозит в хранимой процедуре.
    #39919612
dartaen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg
dartaen
пропущено...

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

А, я думал, это не проблема, раз вы писали, что что то делали во время "зависания" процедуры.

Можно написать скриптик, который будет определять длительное время работы этой процедуры, и, если она "зависла", запускать sp_whoisactive с записью результатов в таблицу.

Я не вручную это делал, перфмон настроил и он писал счётчики в журнал, я потом по журналу сверял данные по долгому исполнению процедуры с блокировками из SQL Blocks, там видно сколько была блокировка. (за этой процедурой выстраивается очередь) Со скриптиком идея хорошая, но боюсь я такое не осилю.. но попробую погуглить на эту тему, спасибо!

alexeyvg
dartaen
Я понимаю что что-то идёт не так, вопрос в том, как попытаться найти в чём проблема..
А есть какая то корреляция между параметрами и временем работы? Может, запустить профайлер с фильтром по имени этой процедуры, и потом поанализировать трассу.

Что значит "проанализировать трассу"? Там что-то можно сохранить помимо времени исполнения процедуры? Про параметры хз, вроде как нет. В совершенно рандомные моменты/параметры случается затык.
...
Рейтинг: 0 / 0
Узнать где тормозит в хранимой процедуре.
    #39919617
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dartaen,

В профайлере нужно настроить на сбор данных инструкций процедуры.
...
Рейтинг: 0 / 0
Узнать где тормозит в хранимой процедуре.
    #39919654
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dartaen,

Статистика выполнения пооператорно:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select
 ps.plan_handle,
 t.statement_text, cast(qp.query_plan as xml) as query_plan,
 qs.execution_count, qs.min_elapsed_time, qs.max_elapsed_time
from
 sys.dm_exec_procedure_stats ps join
 sys.dm_exec_query_stats qs on qs.plan_handle = ps.plan_handle cross apply
 sys.dm_exec_sql_text(qs.plan_handle) st cross apply
 (select case qs.statement_end_offset when -1 then datalength(st.text) else qs.statement_end_offset end) a(statement_end_offset) cross apply
 (select substring(st.text, qs.statement_start_offset / 2 + 1, (a.statement_end_offset - qs.statement_start_offset) / 2 + 1)) t(statement_text)	cross apply
 sys.dm_exec_text_query_plan(ps.plan_handle, qs.statement_start_offset, qs.statement_end_offset) qp
where
 ps.database_id = db_id('MyDatabase') and ps.object_id = object_id('MyProcedure')
order by
 ps.plan_handle; 


По min_elapsed_time и max_elapsed_time можно будет вычислить кто периодически залипает.
Само-собой если не залипает на какой-нибудь императивщине.

ЗЫ: Планов выполнения процедуры может быть много.
...
Рейтинг: 0 / 0
Узнать где тормозит в хранимой процедуре.
    #39919763
dartaen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm
dartaen,

Статистика выполнения пооператорно:
По min_elapsed_time и max_elapsed_time можно будет вычислить кто периодически залипает.
Само-собой если не залипает на какой-нибудь императивщине.

ЗЫ: Планов выполнения процедуры может быть много.


Спасибо большое! А что за императивщина может быть?
...
Рейтинг: 0 / 0
Узнать где тормозит в хранимой процедуре.
    #39921858
Гулин Федор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,
интерсный запрос
без ограничения на
and ps.object_id = object_id('MyProcedure')

у меня выдает
XML datatype instance has too many levels of nested nodes. Maximum allowed depth is 128 levels.

можно это побороть ?
ps sql sever 2012
...
Рейтинг: 0 / 0
Узнать где тормозит в хранимой процедуре.
    #39921890
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гулин Федор
можно это побороть ?
Не преобразовывать qp.query_plan в xml
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Узнать где тормозит в хранимой процедуре.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]