Oracle 11GR2 TKPROF - Как перехватить рекурсивное дерево вызовов
Цель
Определите способ визуального захвата деревьев рекурсивных вызовов на выходе TKPROF (SYS = YES указано).
Окружающая среда
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64-битное производство
Windows 7 64 бит на ядре DELL Latitude i7 2.8GHz 8G и SSD HDD
Фон
Я пытаюсь понять влияние индексации и показаний производительности, как в вопросе Oacle 11G - Эффективный эффект индексации при вставке.
Чтобы понять, что происходит за сценой для индексирования, запустите трассировку SQL в инструкции создания индекса.
Исполнение
Запустите трассировку при создании индекса (SQL в нижней части) и запустите tkprof с параметром "sys = yes".
SQL> ALTER TABLE TBL2 ADD CONSTRAINT PK_TBL2_COL1 PRIMARY KEY(COL1) ;
Table altered.
Elapsed: 00:00:01.75
> trcsess clientid="CREATE_INDEX" output="report_createindex.trc" *.trc
> tkprof createindex.trc output=createindex.txt sys=yes
Вопрос
Я хотел бы знать, есть ли способ visucaly захватить иерархию вызовов, например, объяснить план из файла трассировки (.trc) с помощью tkprof или с помощью других инструментов.
Сгенерированный отчет включает в себя рекурсивные вызовы, такие как "ALTER TABLE TBL2 ADD", вызывающий "INDEX BUILD UNIQUE" и, возможно, дальнейшие рекурсивные вызовы sys вниз по пути. Я полагаю, что вывод не отражает иерархию вызовов (сначала родительский, потом ребенок, следующий за ним).
TKPROF OUTPUT
SQL ID: 2w9c2khpsfj4m
Plan Hash: 3219312727
CREATE UNIQUE INDEX "TRY"."PK_TBL2_COL1" on "TRY"."TBL2"("COL1") NOPARALLEL
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 1 0 0
Execute 1 0.63 0.84 2999 15565 3173 0
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 2 0.63 0.85 2999 15566 3173 0
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 106 (recursive depth: 1) <----------------- child?
Rows Row Source Operation
------- ---------------------------------------------------
1 INDEX BUILD UNIQUE PK_TBL2_COL1 (cr=15904 pr=3003 pw=2090 time=0 us)(object id 0)
1000000 SORT CREATE INDEX (cr=15486 pr=2997 pw=0 time=208370 us)
1000000 TABLE ACCESS FULL TBL2 (cr=15486 pr=2997 pw=0 time=245360 us cost=4413 size=5000000 card=1000000)
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
db file sequential read 575 0.00 0.08
db file scattered read 138 0.00 0.07
direct path write 1 0.00 0.00
********************************************************************************
SQL ID: 47f85g3cmftry
Plan Hash: 0
ALTER TABLE TBL2 ADD CONSTRAINT PK_TBL2_COL1 PRIMARY KEY(COL1)
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.20 0.64 15630 29477 3 0
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 2 0.20 0.64 15630 29477 3 0
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 106 <------------------------------------------ parent?
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
db file sequential read 4 0.00 0.00
db file scattered read 259 0.01 0.42
db file parallel read 2 0.00 0.00
SQL*Net message to client 1 0.00 0.00
SQL*Net message from client 1 0.00 0.00
********************************************************************************
SQL
CREATE TABLE TBL2 (
"COL1" NUMBER,
"COL2" VARCHAR2(100 BYTE)
-- CONSTRAINT "PK_TBL2_COL1" PRIMARY KEY ("COL1")
);
INSERT INTO TBL2 /*+ APPEND MONITOR GATHER_PLAN_STATISTICS CONNECTBY_INSERT */
SELECT LEVEL, rpad(TO_CHAR(LEVEL),100,'A') FROM DUAL CONNECT BY LEVEL <= 1000000
COMMIT;
---------------------------------------------------------------------------
-- Flush the buffers and clear the caches.
---------------------------------------------------------------------------
ALTER SYSTEM CHECKPOINT;
ALTER SYSTEM FLUSH SHARED_POOL;
ALTER SYSTEM FLUSH BUFFER_CACHE;
ALTER SYSTEM SWITCH LOGFILE;
---------------------------------------------------------------------------
-- Start monitoring
---------------------------------------------------------------------------
ALTER SESSION SET TRACEFILE_IDENTIFIER ='CREATE_INDEX';
ALTER SESSION SET TIMED_STATISTICS=true;
BEGIN
DBMS_SESSION.SET_IDENTIFIER('CREATE_INDEX');
DBMS_MONITOR.CLIENT_ID_TRACE_ENABLE('CREATE_INDEX', waits=>true, binds=>false);
DBMS_MONITOR.CLIENT_ID_STAT_ENABLE('CREATE_INDEX');
END;
/
---------------------------------------------------------------------------
-- Run the SQL to insert and monitor
---------------------------------------------------------------------------
SET PAGESIZE 200
SET LINESIZE 200
SET TIMING ON
SET ECHO ON
SET AUTOTRACE ON
ALTER TABLE TBL2 ADD CONSTRAINT PK_TBL2_COL1 PRIMARY KEY(COL1) ;
SET AUTOTRACE OFF
SET ECHO OFF
SET TIMING OFF
---------------------------------------------------------------------------
-- Stop monitoring.
---------------------------------------------------------------------------
BEGIN
DBMS_MONITOR.CLIENT_ID_TRACE_DISABLE('CREATE_INDEX');
DBMS_MONITOR.CLIENT_ID_STAT_DISABLE('CREATE_INDEX');
END;
/
Ссылки
Иногда, чтобы выполнить инструкцию SQL, выданную пользователем, Oracle Database должна выпустить дополнительные инструкции....
Если рекурсивные вызовы возникают, когда объект SQL Trace включен, TKPROF создает статистику для рекурсивных операторов SQL и четко маркирует их как рекурсивные операторы SQL в выходном файле.
Ответы
Ответ 1
Я рекомендую траканализатор. Вы можете загрузить его из поддержки oracle.
TRCANLZR (TRCA): SQL_TRACE/Event 10046 Trace File Analyzer - инструмент для интерпретации сырых следов SQL (Doc ID 224270.1)
Анализатор трассировки содержит раздел "Генеалогия SQL", который показывает дерево как представление рекурсивного SQL.
Как только установлен траканализатор, вы вызываете его с помощью
@trcanlzr <name of tracefile>
Вы даже можете сделать это удаленно от своего клиента (скопируйте trcanlzr.sql script в локальный SQLPATH). Он в конечном итоге скопирует html файл, содержащий анализ, на вашу клиентскую машину.
Ответ 2
На основе информации из @Jan запустите TRCA. Я понимаю, что генеалогия SQL - это иерархия вызовов и разбивка, но, пожалуйста, предоставьте любые предложения/исправления.
SQL
SET AUTOTRACE OFF
SET ECHO ON
SET TIMING OFF
DROP TABLE TBL2 PURGE;
CREATE TABLE TBL2 (
"COL1" NUMBER,
"COL2" VARCHAR2(100 BYTE)
-- CONSTRAINT "PK_TBL2_COL1" PRIMARY KEY ("COL1")
);
INSERT INTO TBL2 /*+ APPEND MONITOR GATHER_PLAN_STATISTICS CONNECTBY_INSERT */
SELECT LEVEL, rpad(TO_CHAR(LEVEL),100,'A') FROM DUAL CONNECT BY LEVEL <= 1000000;
COMMIT;
---------------------------------------------------------------------------
-- Start monitoring
---------------------------------------------------------------------------
ALTER SESSION SET TRACEFILE_IDENTIFIER ='CREATE_INDEX';
ALTER SESSION SET TIMED_STATISTICS=TRUE;
alter session set events '10046 trace name context forever, level 8';
---------------------------------------------------------------------------
-- Run the SQL to insert and monitor
---------------------------------------------------------------------------
ALTER TABLE TBL2 ADD CONSTRAINT PK_TBL2_COL1 PRIMARY KEY(COL1) ;
---------------------------------------------------------------------------
-- Stop monitoring.
---------------------------------------------------------------------------
alter session set events '10046 trace name context off';
TRCA
@run/trcanlzr.sql nr_ora_6976_CREATE_INDEX.trc
TOP SQL (CPU)
![введите описание изображения здесь]()
Генеалогия SQL
![введите описание изображения здесь]()
Ответ 3
Я использую orasrp для анализа файлов трассировки. Он генерирует html-отчеты с иерархическими планами в легко читаемой форме.
Также его легко использовать (в консоли) -
orasrp in_trace.trc out_report.html