Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Мониторинг долгоиграющих запросов в Oracle SE / 15 сообщений из 15, страница 1 из 1
23.09.2016, 13:54
    #39314271
Деев И.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мониторинг долгоиграющих запросов в Oracle SE
Вдруг кому-то пригодится. Если есть запрос с объемными чтениями (например, FULL SCAN или HASH JOIN, которые длятся более 6 сек или сканируют более 10000 блоков), можно использовать скриптик, который выводит план текущего запроса в заданной сессии и время выполнения по v$session_longops. Можно мониторить. Наверное, скрипт можно улучшить, но вот основа:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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 интересующей сессии, где работает долгоиграющий запрос.
...
Рейтинг: 0 / 0
23.09.2016, 14:03
    #39314284
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мониторинг долгоиграющих запросов в Oracle SE
По модулю, action, терминалу и т.п. искать сессии все-таки удобнее, особенно если заранее не озаботился SID-ом.
...и это... connect by, конечно, круто, но разве plan_line_id на SE отменили, как v$sql_plan_monitor и %HIST%?
...
Рейтинг: 0 / 0
23.09.2016, 14:26
    #39314319
Деев И.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мониторинг долгоиграющих запросов в Oracle SE
У нас сейчас SE2 даже, а не SE, т.е. самая простенькая версия.

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

Ну а так - если есть идеи, можно доработать...
...
Рейтинг: 0 / 0
23.09.2016, 16:36
    #39314505
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мониторинг долгоиграющих запросов в Oracle SE
Деев И.plan_line_id - это в v$sql_plan_monitor
Ну да.
Зато в v$sql_plan есть ID.
Посмотрел сейчас в боевой - нашел план на 927 (sic!) шагов.
Вполне адекватно сортируется по id, для красивого форматирования есть поля depth и position.
v$sql_plan
дока на v$sql_planID 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
...
Рейтинг: 0 / 0
23.09.2016, 17:34
    #39314553
Деев И.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мониторинг долгоиграющих запросов в Oracle SE
Действительно, запрос стал проще.
Спасибо за конструктивные замечания!

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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;
...
Рейтинг: 0 / 0
23.09.2016, 19:16
    #39314618
kinky cat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мониторинг долгоиграющих запросов в Oracle SE
Деев И.,

DBMS_SQLTUNE.report_sql_monitor тоже что ли нет ?
...
Рейтинг: 0 / 0
23.09.2016, 19:22
    #39314621
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мониторинг долгоиграющих запросов в Oracle SE
kinky catДеев И.,

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

С другой стороны не совсем понятно какие цели преследует автор при мониторинге.
Часто для анализа перфоманса пользуют произведение Подера Snapper .
...
Рейтинг: 0 / 0
24.09.2016, 11:24
    #39314823
Деев И.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мониторинг долгоиграющих запросов в Oracle SE
Цели тут самые простые. Например, если у вас появился какой-то новый отчет, который перелопачивает довольно много данных, можно понаблюдать онлайн, как отрабатывает запрос. Как-то комфортнее, когда видишь, что происходит и сколько это может продлиться, хотя бы примерно.
...
Рейтинг: 0 / 0
31.10.2016, 10:02
    #39337571
Деев И.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мониторинг долгоиграющих запросов в Oracle SE
Упустил, что еще и по sql_id нужно добавить условие, т.к. sql_exec_id не является уникальным

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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;
...
Рейтинг: 0 / 0
31.10.2016, 11:19
    #39337683
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мониторинг долгоиграющих запросов в Oracle SE
Деев И.
Код: plsql
1.
2.
   and lo.sql_plan_line_id(+) = q_plan.id
   and lo.sql_exec_id(+) = q_sess.sql_exec_id 

Требует 12c.
...
Рейтинг: 0 / 0
31.10.2016, 11:31
    #39337700
client_info
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мониторинг долгоиграющих запросов в Oracle SE
Деев И.Цели тут самые простые. Например, если у вас появился какой-то новый отчет, который перелопачивает довольно много данных, можно понаблюдать онлайн, как отрабатывает запрос. Как-то комфортнее, когда видишь, что происходит и сколько это может продлиться, хотя бы примерно.Я для комфортного наблюдения за тем, что происходит set_client_info вызываю. Это и юзерфрендли мониторинг и зверей убивать не надо (с) ((:.
LongOps, конечно, тоже юзаю.
Но делаю это сразу по нескольким сессиям, т.к. много чего в параллели считается.
...
Рейтинг: 0 / 0
21.11.2016, 18:41
    #39351369
blackmac
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мониторинг долгоиграющих запросов в Oracle SE
Деев И.,

Илья, послал контакты Алексея.
...
Рейтинг: 0 / 0
22.11.2016, 13:24
    #39351811
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мониторинг долгоиграющих запросов в Oracle SE
ElicДеев И.
Код: plsql
1.
2.
   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 более ранних версиях будет тут ошибка. Это да.
...
Рейтинг: 0 / 0
22.11.2016, 13:26
    #39351816
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мониторинг долгоиграющих запросов в Oracle SE
Деев И.У нас сейчас SE2 даже, а не SE, т.е. самая простенькая версия.SE2 - это не "самая простенькая версия",
а самая современная стандартная редакция.
Начиная с 12.1.0.2 она пришла на смену SE1 и SE.
То есть последняя версия SE1 и SE - это 12.1.0.1
...
Рейтинг: 0 / 0
30.11.2016, 16:25
    #39357784
Деев И.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Мониторинг долгоиграющих запросов в Oracle SE
Да, неверно выразился. Имел в виду, что это самая ограниченная по используемым процессорным ресурсам версия (2 процессора по 10 ядер, если не ошибаюсь). Хотя по функционалу - даже шире, так как RAC в SE2 доступен по лицензии даже на двух процессорах (В SE1 был вообще недоступен).
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Мониторинг долгоиграющих запросов в Oracle SE / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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