Oracle 11GR2 TKPROF - 재귀적 콜 트리를 캡처하는 방법
객관적으로
TKPROF 출력(SYS=YES 지정)에서 재귀 호출 트리를 시각적으로 캡처하는 방법을 알아봅니다.
환경
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64비트 프로덕션
DELL Latitude 코어 i72.8의 Windows 7 64비트GHz 8G 메모리 & SSD HDD
배경
Oacle 11G - 삽입 시 인덱싱의 성능 효과 질문과 같이 인덱싱의 효과와 성능 지표를 이해하려고 합니다.
인덱싱을 위해 장면 뒤에서 무슨 일이 일어나고 있는지 자세히 파악하려면 create index 문에서 SQL 추적을 실행합니다.
실행
인덱스 생성에 대한 추적(SQL 아래쪽)을 실행하고 " sys= yes" 옵션을 사용하여 tkprof를 실행합니다.
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
질문.
tkprof 또는 다른 도구를 사용하여 추적(.trc) 파일에서 계획 설명과 같이 호출 계층을 시각적으로 캡처할 수 있는 방법이 있는지 알고 싶습니다.
생성된 보고서에는 "INDEX BUILD UNIQUE"를 유도하는 "ALTER TABL2 ADD"와 같은 재귀적 호출 및 경로 아래에 있는 추가 sys 재귀적 호출이 포함됩니다.출력이 호출 계층(부모가 먼저이고 자식이 바로 뒤에 있음)을 반영하지 않는다고 가정합니다.
TKPROPE 출력
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;
/
참고문헌
- Oracle 11GR2 문서 21.4.4.5 재귀 호출의 이해
때때로 사용자가 발행한 SQL 문을 실행하려면 Oracle Database에서 추가 문을 발행해야 합니다. ...
SQL Trace 기능이 활성화된 상태에서 재귀 호출이 발생하면 TKPROF는 재귀 SQL 문에 대한 통계를 생성하고 출력 파일에 재귀 SQL 문으로 명확하게 표시합니다.
추적 분석기를 추천합니다.Oracle 지원에서 다운로드할 수 있습니다.TRCANLZR (TRCA) : SQL_TRACE/Event 10046 Trace File Analyzer - Raw SQL Trace 해석 도구 (Doc ID 224270.1)
추적 분석기에는 재귀적 SQL의 트리와 같은 뷰를 보여주는 "SQL 계보" 장이 있습니다.
추적 분석기가 설치되면 다음과 같이 호출합니다.
@trcanlzr <name of tracefile>
클라이언트에서 원격으로 이 작업을 수행할 수도 있습니다(trcanlzr.sql 스크립트를 로컬 SQLPATH에 복사).최종적으로 분석 내용이 포함된 HTML 파일을 클라이언트 컴퓨터에 복사합니다.
@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
상위 SQL(CPU)
SQL 계보
추적 파일을 분석할 때 orasrp를 사용합니다.그것은 읽기 쉬운 형태로 계층 구조 계획을 가진 html 보고서를 생성합니다.또한 사용이 용이한 (콘솔) -
orasrp in_trace.trc out_report.html
언급URL : https://stackoverflow.com/questions/31227978/oracle-11gr2-tkprof-how-to-capture-the-recursive-call-tree
'programing' 카테고리의 다른 글
자바스크립트 한 줄에 여러 변수를 정의하는 방법은? (0) | 2023.10.04 |
---|---|
Ajax 시나리오에서 오류를 반환하는 방법 (0) | 2023.10.04 |
$routeParams가 메인 컨트롤러에 비어 있습니다. (0) | 2023.10.04 |
Python에서 요청이 AJAX인지 확인합니다. (0) | 2023.10.04 |
설치된 Android 응용프로그램 목록을 가져와서 실행할 응용프로그램을 선택하는 방법 (0) | 2023.10.04 |