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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В профайлере нужно настроить на сбор данных инструкций процедуры.
...
Рейтинг: 0 / 0
28.01.2020, 21:00
    #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
29.01.2020, 09:10
    #39919763
dartaen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать где тормозит в хранимой процедуре.
invm
dartaen,

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

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


Спасибо большое! А что за императивщина может быть?
...
Рейтинг: 0 / 0
03.02.2020, 15:18
    #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
03.02.2020, 16:15
    #39921890
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать где тормозит в хранимой процедуре.
Гулин Федор
можно это побороть ?
Не преобразовывать qp.query_plan в xml
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Узнать где тормозит в хранимой процедуре. / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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