Подтвердить что ты не робот

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 в выходном файле.

4b9b3361

Ответ 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