Page tree
Skip to end of metadata
Go to start of metadata

Более полный мануал здесь — Как трассировать SQL и PL/SQL.

Как понять логику планировщика и оптимизатора Трассировка с 10053 event.

Важные замечания

Трассировка по своей сути является периодическим прерыванием работы процесса и сбрасыванием на диск текущего состояния (его мы видим в сырой трассировке). Как можно повысить качество трассировки:

  • Трассировать дольше. Если речь идет о медленном задании, то имеет смысл потрассировать ее минут 10. За это время накопится больше статистики и тормозящие запросы будут видны более явно.
  • Запускать трассировку до начала работы медленного процесса. Такая возможность есть не всегда, но если есть, то надо пользоваться. Такой запуск покажет какие планы выполнения выбрал оракл (план он строит при первой встрече запроса, потом просто использует и в трассировку он уже не попадает).
  • Трассировать в максимально изолированных условиях. Если процессу что-то мешает блокировками (например другая джоба), то в трассировке будет много мусорных ожиданий захвата блокировки.
  • Не надо трассировать дедлоки и "ловить" их. Это бессмысленная затея. Оракл раньше вас обнаружит дедлок, сбросит текущее состояние двух процессов на диск и выкинет ошибку.

1. Включение режима трассировки и выполнение произвольной процедуры:

BEGIN
DBMS_SESSION.SESSION_TRACE_ENABLE;
ss_jobs_pkg.run_job(457633170401);
COMMIT;
DBMS_SESSION.SESSION_TRACE_DISABLE;
END;

В данном примере показан запуск задания с идентификатором 457633170401 в режиме трассировки сессии.

2. Если используется Oracle версии 11 или выше, результат трассировки хранится по адресу:

/opt/oracle/diag/rdbms/<db>/<db>/trace

В данной папке необходимо найти файл с расширением *.trc.

3. Полученный *.trc файл необходимо преобразовать в доступный для чтения формат утилитой tkprof, которая поставляется в комплекте с Oracle. Утилита располагается по адресу /opt/oracle/product/<номер версии>/bin/. Вызов осуществляется следующим образом:

oracle@server:~/product/11.2.0.2/bin$ tkprof <путь до *.trc файла>

При запуске утилита попросит указать путь до файла назначения. Можно использовать адрес домашней директории.

Чтобы профилировку было удобно анализировать, можно при этом еще добавить параметры для сортировки:

oracle@server:~/product/11.2.0.2/bin$ tkprof <путь до *.trc файла> SORT="(FCHELA,EXEELA)"

4. Включение режима трассировки для сессии:

         Если мы собираемся трассировать свою сессию, то необходимо выполнить команду:

ALTER session SET events '10046 trace name context forever, level N'; -- включение трассировки
ALTER session SET events '10046 trace name context off'; -- выключение трассировки

 

Если мы собираемся трассировать чужую сессию, то необходимо сначала выяснить sid, serial, выполнив команду:

COL sid FOR 999999
COL serial# FOR 999999
COL username FOR a20
COL osuser FOR a20
SELECT s.sid,
       s.serial#,
       s.username,
       s.osuser 
FROM   v$session s,
       v$process p
WHERE s.paddr=p.addr;

далее

EXEC SYS.DBMS_SYSTEM.SET_EV(sid,serial,10046,N,''); -- включение трассировки
EXEC SYS.DBMS_SYSTEM.SET_EV(sid,serial,10046,0,''); -- выключение трассировки

где sid, serial -- это понятно что, а N -- требуемый level  (уровень трассировки).

level 1 -- в trace файл пишется статистика вида ***, APPNAME, PARSING IN CURSOR, PARSE ERROR, PARSE, EXEC, FETCH, UNMAP, SORT UNMAP, ERROR, STAT и XCTEND
level 4 -- то же, что и в level 1 плюс BINDS секции.
level 8 -- то же, что и в level 1 плюс WAIT строки.
level 12 -- level 1 плюс level 4 плюс level 8.

 5. Если сессия трассируется повторно, то надо не забыть удалить старый файл с трассировкой, чтобы результаты предыдущей трассировки не влияли на общую картину.

 

  • No labels