Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Мониторинг долгоиграющих запросов в Oracle SE  [new]
Деев И.
Member

Откуда: отсюда
Сообщений: 783
Вдруг кому-то пригодится. Если есть запрос с объемными чтениями (например, FULL SCAN или HASH JOIN, которые длятся более 6 сек или сканируют более 10000 блоков), можно использовать скриптик, который выводит план текущего запроса в заданной сессии и время выполнения по v$session_longops. Можно мониторить. Наверное, скрипт можно улучшить, но вот основа:

with 
  q_sess as (select sql_id, sql_child_number, s.sql_exec_id, s.sid 
               from v$session s where sid = 803/*SID*/),
  q_plan as (select rownum rn, q.id, lpad(' ',level *2,' ')||q.oper as operation, q.object_name, q.cardinality, q.bytes, q.cost 
               from (select id, parent_id, operation||' '||options oper, object_name, cardinality, bytes, cost  
                       from v$sql_plan p 
                      where (p.sql_id, p.child_number) 
                         in (select sql_id, sql_child_number from q_sess)
                    ) q
            connect by prior q.id = q.parent_id
              start with q.id = 0)              
select q_plan.*, to_char(lo.sofar/lo.totalwork*100,'990') pct, lo.elapsed_seconds, lo.time_remaining 
  from q_plan
     , q_sess
     , v$session_longops lo 
  where lo.sid(+) = q_sess.sid
    and lo.sql_plan_line_id(+) = q_plan.id
    and lo.sql_exec_id(+) = q_sess.sql_exec_id 
  order by rn;

Нужно задать SID интересующей сессии, где работает долгоиграющий запрос.
23 сен 16, 13:54    [19700511]     Ответить | Цитировать Сообщить модератору
 Re: Мониторинг долгоиграющих запросов в Oracle SE  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18388
По модулю, action, терминалу и т.п. искать сессии все-таки удобнее, особенно если заранее не озаботился SID-ом.
...и это... connect by, конечно, круто, но разве plan_line_id на SE отменили, как v$sql_plan_monitor и %HIST%?
23 сен 16, 14:03    [19700562]     Ответить | Цитировать Сообщить модератору
 Re: Мониторинг долгоиграющих запросов в Oracle SE  [new]
Деев И.
Member

Откуда: отсюда
Сообщений: 783
У нас сейчас SE2 даже, а не SE, т.е. самая простенькая версия.

v$sql_plan_monitor - у нас там пусто
%HIST% - тоже пустые (AWR и ASH в SE не входят)
plan_line_id - это в v$sql_plan_monitor

Ну а так - если есть идеи, можно доработать...
23 сен 16, 14:26    [19700691]     Ответить | Цитировать Сообщить модератору
 Re: Мониторинг долгоиграющих запросов в Oracle SE  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18388
Деев И.
plan_line_id - это в v$sql_plan_monitor

Ну да.
Зато в v$sql_plan есть ID.
Посмотрел сейчас в боевой - нашел план на 927 (sic!) шагов.
Вполне адекватно сортируется по id, для красивого форматирования есть поля depth и position.
v$sql_plan
дока на v$sql_plan
ID NUMBER A number assigned to each step in the execution plan
PARENT_ID NUMBER ID of the next execution step that operates on the output of the current step
DEPTH NUMBER Depth (or level) of the operation in the tree. It is not necessary to issue a CONNECT BY statement to get the level information, which is generally used to indent the rows from the PLAN_TABLE table. The root operation (statement) is level 0.
POSITION NUMBER Order of processing for all operations that have the same PARENT_ID
23 сен 16, 16:36    [19701580]     Ответить | Цитировать Сообщить модератору
 Re: Мониторинг долгоиграющих запросов в Oracle SE  [new]
Деев И.
Member

Откуда: отсюда
Сообщений: 783
Действительно, запрос стал проще.
Спасибо за конструктивные замечания!

with 
  q_sess as (select sql_id, sql_child_number, s.sql_exec_id, s.sid 
               from v$session s where sid = 32/*SID*/),
  q_plan as (select id, lpad(' ',depth *2,' ')||operation||' '||options operation, object_name, cardinality, bytes, cost  
               from v$sql_plan p 
              where (p.sql_id, p.child_number) in (select sql_id, sql_child_number from q_sess)                     
            )              
select q_plan.*, round(lo.sofar/lo.totalwork*100) pct, lo.elapsed_seconds, lo.time_remaining 
  from q_plan
     , q_sess
     , v$session_longops lo 
 where lo.sid(+) = q_sess.sid
   and lo.sql_plan_line_id(+) = q_plan.id
   and lo.sql_exec_id(+) = q_sess.sql_exec_id 
 order by id;
23 сен 16, 17:34    [19701853]     Ответить | Цитировать Сообщить модератору
 Re: Мониторинг долгоиграющих запросов в Oracle SE  [new]
kinky cat
Member

Откуда: с дивана23
Сообщений: 1238
Деев И.,

DBMS_SQLTUNE.report_sql_monitor тоже что ли нет ?
23 сен 16, 19:16    [19702224]     Ответить | Цитировать Сообщить модератору
 Re: Мониторинг долгоиграющих запросов в Oracle SE  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
kinky cat
Деев И.,

DBMS_SQLTUNE.report_sql_monitor тоже что ли нет ?
В SE нет.

С другой стороны не совсем понятно какие цели преследует автор при мониторинге.
Часто для анализа перфоманса пользуют произведение Подера Snapper.
23 сен 16, 19:22    [19702246]     Ответить | Цитировать Сообщить модератору
 Re: Мониторинг долгоиграющих запросов в Oracle SE  [new]
Деев И.
Member

Откуда: отсюда
Сообщений: 783
Цели тут самые простые. Например, если у вас появился какой-то новый отчет, который перелопачивает довольно много данных, можно понаблюдать онлайн, как отрабатывает запрос. Как-то комфортнее, когда видишь, что происходит и сколько это может продлиться, хотя бы примерно.
24 сен 16, 11:24    [19703785]     Ответить | Цитировать Сообщить модератору
 Re: Мониторинг долгоиграющих запросов в Oracle SE  [new]
Деев И.
Member

Откуда: отсюда
Сообщений: 783
Упустил, что еще и по sql_id нужно добавить условие, т.к. sql_exec_id не является уникальным

with
  q_sess as (select sql_id, sql_child_number, s.sql_exec_id, s.sid
               from v$session s where sid = 1303/*SID*/),
  q_plan as (select id, lpad(' ',depth * 2,' ')||operation||' '||options operation, object_name, cardinality, bytes, cost
               from v$sql_plan p
              where (p.sql_id, p.child_number) in (select sql_id, sql_child_number from q_sess)                   
            )            
select q_plan.*
     , round(lo.sofar/lo.totalwork*100) pct, lo.elapsed_seconds, lo.time_remaining
  from q_plan
     , q_sess
     , v$session_longops lo
 where lo.sid(+) = q_sess.sid
   and lo.sql_plan_line_id(+) = q_plan.id
   and lo.sql_exec_id(+) = q_sess.sql_exec_id
   and lo.sql_id(+) = q_sess.sql_id
 order by id;
31 окт 16, 10:02    [19840290]     Ответить | Цитировать Сообщить модератору
 Re: Мониторинг долгоиграющих запросов в Oracle SE  [new]
Elic
Member

Откуда:
Сообщений: 29990
Деев И.
   and lo.sql_plan_line_id(+) = q_plan.id
   and lo.sql_exec_id(+) = q_sess.sql_exec_id 
Требует 12c.
31 окт 16, 11:19    [19840657]     Ответить | Цитировать Сообщить модератору
 Re: Мониторинг долгоиграющих запросов в Oracle SE  [new]
client_info
Guest
Деев И.
Цели тут самые простые. Например, если у вас появился какой-то новый отчет, который перелопачивает довольно много данных, можно понаблюдать онлайн, как отрабатывает запрос. Как-то комфортнее, когда видишь, что происходит и сколько это может продлиться, хотя бы примерно.
Я для комфортного наблюдения за тем, что происходит set_client_info вызываю. Это и юзерфрендли мониторинг и зверей убивать не надо (с) ((:.
LongOps, конечно, тоже юзаю.
Но делаю это сразу по нескольким сессиям, т.к. много чего в параллели считается.
31 окт 16, 11:31    [19840724]     Ответить | Цитировать Сообщить модератору
 Re: Мониторинг долгоиграющих запросов в Oracle SE  [new]
blackmac
Member

Откуда:
Сообщений: 354
Деев И.,

Илья, послал контакты Алексея.
21 ноя 16, 18:41    [19917898]     Ответить | Цитировать Сообщить модератору
 Re: Мониторинг долгоиграющих запросов в Oracle SE  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8132
Elic
Деев И.
   and lo.sql_plan_line_id(+) = q_plan.id
   and lo.sql_exec_id(+) = q_sess.sql_exec_id 
Требует 12c.
Поскольку ТС работает на SE2, версия его СУБД не ниже 12.1.0.2.

Но на 11g более ранних версиях будет тут ошибка. Это да.
22 ноя 16, 13:24    [19920388]     Ответить | Цитировать Сообщить модератору
 Re: Мониторинг долгоиграющих запросов в Oracle SE  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8132
Деев И.
У нас сейчас SE2 даже, а не SE, т.е. самая простенькая версия.
SE2 - это не "самая простенькая версия",
а самая современная стандартная редакция.
Начиная с 12.1.0.2 она пришла на смену SE1 и SE.
То есть последняя версия SE1 и SE - это 12.1.0.1
22 ноя 16, 13:26    [19920407]     Ответить | Цитировать Сообщить модератору
 Re: Мониторинг долгоиграющих запросов в Oracle SE  [new]
Деев И.
Member

Откуда: отсюда
Сообщений: 783
Да, неверно выразился. Имел в виду, что это самая ограниченная по используемым процессорным ресурсам версия (2 процессора по 10 ядер, если не ошибаюсь). Хотя по функционалу - даже шире, так как RAC в SE2 доступен по лицензии даже на двух процессорах (В SE1 был вообще недоступен).
30 ноя 16, 16:25    [19952269]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить