Более полный мануал здесь — Как трассировать SQL и PL/SQL. Как понять логику планировщика и оптимизатора — Трассировка с 10053 event. |
Трассировка по своей сути является периодическим прерыванием работы процесса и сбрасыванием на диск текущего состояния (его мы видим в сырой трассировке). Как можно повысить качество трассировки:
|
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. Если сессия трассируется повторно, то надо не забыть удалить старый файл с трассировкой, чтобы результаты предыдущей трассировки не влияли на общую картину.