가이드‎ > ‎

사용자 가이드

티팩 코어 - 분석 기본 리포트들

샘플 리포트들을 수행하기 위해 SQL*Plus에서 다음과 같은 옵션을 사용해야 합니다.

SQL*Plus Options

set serveroutput on
set long 100000
set pages 10000
set lines 200

Session Detail Report

  • Session Detail Report는 특정 세션에 대한 상세한 정보를 보여줍니다. 
  • 다음과 같은 정보들이 제공됩니다.
    • session_basic : 세션 기본 정보
    • opt_env : Non Default Optimizer Environment
    • plan_typical : TYPICAL Plan 정보
    • plan_advanced : ADVANCED Plan 정보
    • wait_basic : 대기 이벤트 기본 정보
    • wait_detail : 대기 이벤트 상세 정보
library cache pin 경합이 발생하는 상황에서 Session Detail Report를 이용해 문제를 분석하는 간단한 예제입니다. 

1. Session #1에서 다음과 같은 프로시저를 만듭니다.

Session #1

create or replace procedure proc1 
is
begin
  dbms_lock.sleep(60);
end;
/

exec proc1;



2. 세션 #1이 작업을 수행하는 동안 세션 #2에서 다음 작업을 수행하면 대기 상태에 빠집니다.

Session #2

-- while proc1 is being executed
alter procedure proc1 compile;



3. TPack Session(Session #3)에서 대기 상태에 있는 세션 목록을 조회하고, library cache pin을 대기하는 세션에 대해 Session Detail Report(session_basic + wait_detail 옵션)를 추출합니다. Library cache pin 대기에 대한 상세한 정보가 보여집니다. 이러한 상세한 대기 이벤트 정보를 지능적 대기 이벤트 분석이라고 부릅니다. 

TPack Session

SQL> select * from table(tpack.session_list) where state='WAITING';

       SID  SERIAL_NO SPID
---------- ---------- ------------------------
PROGRAM
----------------------------------------------------------------
MODULE                                           SQL_ID        CHILD_NUMBER
------------------------------------------------ ------------- ------------
SQL_TEXT
-----------------------------------------------------------------------------

WAIT                                                              WAIT_TIME
---------------------------------------------------------------- ----------
STATUS   STATE
-------- -------------------
       147       9786 5148
sqlplus.exe
SESSION1                                         7ap74x3urn7f7            0
BEGIN proc1; END;
PL/SQL lock timer                                                         0
ACTIVE   WAITING

       135       7929 1440
sqlplus.exe
SESSION2                                         6smn089hba4ag            0
alter procedure proc1 compile
library cache pin                                                         0
ACTIVE   WAITING

       141       9103 6060
ORACLE.EXE (J000)
                                                                          0

jobq slave wait                                                           0
ACTIVE   WAITING


SQL> select * from table(tpack.session_detail(135, 'session_basic+wait_detail'));

NAME                 VALUE
-------------------- -------------------------------------------------------
SID                  135
Serial#              7929
SPID                 1440
Program              sqlplus.exe
Process              5376:6012
Module               SESSION2
SQL ID               6smn089hba4ag
Child No             0
SQL Text             alter procedure proc1 compile
Status               ACTIVE
Blocking Instance    1
Blocking Session     147
SQL Exec Start       2010/05/31 09:58:32
Event                library cache pin
Seq#                 41
P1(P1raw)            665379380(0000000027A8E234)
P2(P2raw)            665379380(00000000279CD3E4)
P3(P3raw)            665379380(000000000000012D)
Seconds in wait      15
State                WAITING
Wait Event           library cache pin
Holder SID           147
Namespace            TABLE/PROCEDURE
Object               PROC1
Holding Mode         2(S)




SQL Detail Report

  • SQL Detail Report는 특정 SQL에 대한 상세한 정보를 제공하는 리포트입니다. 
  • 다음과 같은 정보들이 제공됩니다. 
    • sql_basic : SQL 기본 정보
    • sql_plan : SQL Plan 정보
    • AWR_plan : AWR Plan 정보
    • child_cursors : V$SQL_SHARED_CURSOR 정보
    • bind_capture : V$SQL_BIND_CAPTURE 정보
    • opt_env : Non Default Optimizer Environment 정보
    • plan_statistics : Plan Statistics 정보
    • cursor_dump : Active Cursor의 Cursor Dump 정보. 현재 수행 중인 SQL의 바인드 값을 얻을 때 사용
    • histogram : SQL이 참조하는 테이블의 Histogram 정보
    • object_describe : SQL이 참조하는 테이블/인덱스의 DDL 정보
오랜 시간 수행되는 SQL 문의 바인드 값을 SQL Detail Report를 통해 추출하는 간단한 예제입니다.

1. Session #1에서 다음과 같이 장시간 수행되는 SQL 문장을 수행합니다. 

Session #1

drop table t1 purge;
create table t1(c1 number, c2 varchar2(10));
insert into t1 values(1, 'x');
commit;

var b1 number;
var b2 varchar2(10);

begin
  :b1 := 1;
  :b2 := 'x';
end;
/

select count(*) from t1
where c1 = :b1 and c2 = :b2 and tpack.f_wait_for_signal = 1;



2. TPack Session에서 Session #1의 Current SQL에 대해 SQL Detail Report(sql_basic + cursor_dump 옵션)을 수행하고, 바인드 값(Cursor Dump 항목 참조)을 알아냅니다.

SQL Detail Report

SQL> select * from table(tpack.sql_detail(&sid1, null, null, 'sql_basic+sql_plan+cursor_dump'));

NAME                 VALUE
-------------------- ----------------------------------------------------------------------------------------------------
SQL ID               3yqxhkufdj3sh
Child Number         1
SQL Text             select count(*) from t1 where c1 = :b1 and c2 = :b2 and tpack.f_wait_for_signal = 1
Hash Value           2631438096
Address              2C2C1A38
Plan Hash Value      4294799605
Bind Sensitive       N
Bind Aware           N
SQL Plan             SQL_ID  3yqxhkufdj3sh, child number 1
                     -------------------------------------
                     select count(*) from t1 where c1 = :b1 and c2 = :b2 and
                     tpack.f_wait_for_signal = 1

                     Plan hash value: 4294799605

                     ----------------------------------------------------------------------------
                     | Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
                     ----------------------------------------------------------------------------
                     |   0 | SELECT STATEMENT    |      |       |       |     4 (100)|          |
                     |   1 |  SORT AGGREGATE     |      |     1 |    20 |            |          |
                     |*  2 |   FILTER            |      |       |       |            |          |
                     |*  3 |    TABLE ACCESS FULL| T1   |     1 |    20 |     4   (0)| 00:00:01 |
                     ----------------------------------------------------------------------------

                     Query Block Name / Object Alias (identified by operation id):
                     -------------------------------------------------------------

                        1 - SEL$1
                        3 - SEL$1 / T1@SEL$1

                     Outline Data
                     -------------

                       /*+
                           BEGIN_OUTLINE_DATA
                           IGNORE_OPTIM_EMBEDDED_HINTS
                           OPTIMIZER_FEATURES_ENABLE('11.1.0.6')
                           DB_VERSION('11.1.0.6')
                           ALL_ROWS
                           OUTLINE_LEAF(@"SEL$1")
                           FULL(@"SEL$1" "T1"@"SEL$1")
                           END_OUTLINE_DATA
                       */

                     Peeked Binds (identified by position):
                     --------------------------------------

                        1 - :B1 (NUMBER): 1
                        2 - :B2 (VARCHAR2(30), CSID=846): 'x'

                     Predicate Information (identified by operation id):
                     ---------------------------------------------------

                        2 - filter("TPACK"."F_WAIT_FOR_SIGNAL"()=1)
                        3 - filter(("C1"=:B1 AND "C2"=:B2))

                     Column Projection Information (identified by operation id):
                     -----------------------------------------------------------

                        1 - (#keys=0) COUNT(*)[22]

                     Note
                     -----
                        - dynamic sampling used for this statement



Cursor Dump          Cursor#4(0x10750E24) state=BOUND curiob=0x0ECB5DE0
                      curflg=4e fl2=0 par=0x00000000 ses=0x35945354
                     ----- Dump Cursor sql_id=3yqxhkufdj3sh xsc=0x0ECB5DE0 cur=0x10750E24 -----
                     Dump Parent Cursor sql_id=3yqxhkufdj3sh phd=0x2C2C1A38 plk=0x2B855A10
                      sqltxt(0x2C2C1A38)=select count(*) from t1
                     where c1 = :b1 and c2 = :b2 and tpack.f_wait_for_signal = 1
                       hash=0c59df98b627aa4a3f5bb0969cd88f10
                       parent=0x266A8B7C maxchild=02 plk=0x2B855A10 ppn=n
                     cursor instantiation=0x0ECB5DE0 used=1275269134 exec_id=16777219 exec=1
                      child#1(0x2C25540C) pcs=0x266A88D8
                       clk=0x2B85598C ci=0x266B10BC pn=0x224F65C8 ctx=0x28BBE5E8
                      kgsccflg=0 llk[0x0ECB5DE4,0x0ECB5DE4] idx=0
                      xscflg=c0110676 fl2=1d100008 fl3=42222008 fl4=100
                     ----- Bind Byte Code (IN) -----
                       Opcode = 2   Bind Twotask Scalar Sql In (may be out) Copy
                       oacdef = 266B1334   Offsi = 36, Offsi = 0
                       Opcode = 2   Bind Twotask Scalar Sql In (may be out) Copy
                       oacdef = 266B1358   Offsi = 36, Offsi = 20
                     ----- Bind Info (kkscoacd) -----
                      Bind#0
                       oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
                       oacflg=03 fl2=1000000 frm=00 csi=00 siz=56 off=0
                       kxsbbbfp=0ea89218  bln=22  avl=02  flg=05
                       value=1
                      Bind#1
                       oacdty=01 mxl=32(10) mxlc=00 mal=00 scl=00 pre=00
                       oacflg=03 fl2=1000000 frm=01 csi=846 siz=0 off=24
                       kxsbbbfp=0ea89230  bln=32  avl=01  flg=01
                       value="x"
                      Frames pfr 0x0EA8FBA8 siz=3444 efr 0x0EA8F9D0 siz=3068
                      Cursor frame dump
                       enxt: 3.0x0000005c  enxt: 2.0x00000028  enxt: 1.0x00000b78
                       pnxt: 1.0x00000178
                      kxscphp=0x10756FB8 siz=1000 inu=728 nps=560
                      kxscbhp=0x10756EB0 siz=1000 inu=160 nps=68
                      kxscwhp=0x1137B260 siz=12220 inu=8432 nps=136
                     Starting SQL statement dump
                     SQL Information
                     user_id=113 user_name=TPACK module=SESSION1 action=
                     sql_id=3yqxhkufdj3sh plan_hash_value=-167691 problem_type=3
                     ----- Current SQL Statement for this session (sql_id=3yqxhkufdj3sh) -----
                     select count(*) from t1
                     where c1 = :b1 and c2 = :b2 and tpack.f_wait_for_signal = 1
                     ----- PL/SQL Stack -----
                     ----- PL/SQL Call Stack -----
                       object      line  object
                       handle    number  name
                     2809E2B4       169  package body SYS.DBMS_PIPE
                     257F8358       682  package body TPACK.TPACK
                     257F8358       695  package body TPACK.TPACK
                     2C25540C         1  anonymous block
                     sql_text_length=84
                     sql=select count(*) from t1
                     where c1 = :b1 and c2 = :b2 and tpack.f_wait_for_signal = 1
                     ====================== END SQL Statement Dump ======================



Session Snapshot Report

  • Session Snapshot Report는 특정 세션에 대해 복수 개의 Snapshot을 생성하고 Snapshot 간의 Diff를 보여주는 리포트입니다. 
    • Session ID를 0보다 작거나 같은 값으로 주면 System Level의 Snapshot을 사용합니다. 
  • 세션의 성능 문제에 대한 가장 직관적인 지표들을 제공합니다. 
  • 다음과 같은 항목들이 대상이 됩니다.
    • V$SESSTAT, V$SYSSTAT
    • V$SESSION_EVENT, V$SYSTEM_EVENT
    • V$SESS_TIME_MODEL, V$SYS_TIME_MODEL
    • V$LATCH
    • V$ROWCACHE
    • V$MUTEX_SLEEP(_HISTORY)
    • Buffer Get 정보
    • V$SGA_RESIZE_OPS
    • V$LIBRARYCACHE
    • V$OSSTAT
1. Session #1에서 아래와 같이 장시간 수행되는 SQL 문장을 수행합니다. 

Session #1

select *
from all_objects
where tpack.sleep(rownum, rownum/1000000) = 1;



2. TPack Session에서 다음과 같이 Session #1에 대해 Session Snapshot Report(Snapshot 개수 = 5개, Snapshot 간 Sleep Time = 1초)를 생성합니다. tpack.session_snapshop_report 함수를 호출하는데 두 가지 모드(수동 모드, 자동 모드)가 가능합니다. 

TPack Session

-- 5번 add_session_snapshot 호출
exec tpack.begin_session_snapshot(&sid1);
exec dbms_lock.sleep(1);
exec tpack.add_session_snapshot(&sid1);
exec dbms_lock.sleep(1);
exec tpack.add_session_snapshot(&sid1);
exec dbms_lock.sleep(1);
exec tpack.add_session_snapshot(&sid1);
exec dbms_lock.sleep(1);
exec tpack.add_session_snapshot(&sid1);
exec dbms_lock.sleep(1);
exec tpack.add_session_snapshot(&sid1);

select * from table(tpack.session_snapshot_report(&sid1));

-- or

select * from table(tpack.session_snapshot_report(&sid1, 5, 1));


3. Session Snapshot Report의 결과입니다. 총 5개의 델타 값이 보여지는 것을 알 수 있습니다. Snapshot 개수에는 제한이 없습니다. 

TPack Session - Report

TYPE       ITEM                            START_VAL    END_VAL TOTAL_DELTA DELTAS
---------- ------------------------------ ---------- ---------- ----------- ------------------------------
STAT       session uga memory max            3405412    3906900      501488 335012->0->0->166476->0
STAT       session pga memory                5482068    5744212      262144 131072->131072->131072->-13107
                                                                            2->0

STAT       bytes sent via SQL*Net to clie      34959      66261       31302 6125->6322->5108->6625->7122
           nt

STAT       session uga memory                3209020    3224188       15168 7584->7584->312356->-312356->0
STAT       table scan rows gotten               4987       9592        4605 881->1020->865->903->936
STAT       consistent gets from cache           1529       2644        1115 369->243->293->133->77
STAT       session logical reads                1536       2651        1115 369->243->293->133->77
STAT       consistent gets                      1529       2644        1115 369->243->293->133->77
STAT       consistent gets from cache (fa       1387       2429        1042 327->237->279->122->77
           stpath)
...

TIME       DB time                            336492     424936       88444 34578->15921->17933->10988->90
                                                                            24

TIME       sql execute elapsed time           263111     350580       87469 34357->15730->17732->10818->88
                                                                            32

TIME       DB CPU                             250000     328125       78125 15625->15625->0->31250->15625
TIME       PL/SQL execution elapsed time        6783      13662        6879 2534->1224->1099->918->1104
WAIT       SQL*Net message from client          1623       2145         522 99->110->107->97->109
LATCH      cache buffers chains            176014916  176035497       20581 4268->4176->4177->4023->3937
LATCH      row cache objects                18160833   18165650        4817 1333->1096->1411->535->442
LATCH      SQL memory manager workarea li   13068403   13070138        1735 445->428->470->180->212
           st latch

LATCH      undo global data                   978931     979354         423 86->89->82->85->81
LATCH      object queue header operation     8459996    8460250         254 54->55->46->49->50
...

ROWCACHE   dc_tablespaces                    1152041    1152841         800 222->182->235->89->72
ROWCACHE   dc_users                          2122943    2123741         798 222->180->235->89->72
ROWCACHE   global database name               367433     367437           4 0->2->0->0->2
ROWCACHE   dc_awr_control                      10673      10674           1 0->0->0->0->1
ROWCACHE   dc_segments                        108927     108928           1 0->1->0->0->0
BUFF GET   qeilwhgp: qeilbk                   105987     105995           8 4->0->2->2->0
BUFF GET   qeilwhrp: qeilbk                   407858     407859           1 0->0->0->1->0


Latch Profile Report

  • Latch Profile Report는 특정 세션의 래치 획득 상황을 보고합니다. 래치에 의한 문제를 좀 더 심도깊게 분석하고자 할때 사용됩니다.
  • 다음과 같은 항목들에 대해 래치 획득을 보고합니다.
    • LATCH_NAME : 래치 이름(예: cache buffers chains)
    • LATCH_ADDR : 래치 주소. 여러 개의 차일드 래치가 존재하는 경우
    • CODE_NAME : 래치를 획득한 커널 코드 정보
    • SQL_ID : 래치를 획득할 당시의 SQL ID
    • OBJ_WHY : 래치 획득과 관련된 오브젝트. cache buffers chains 래치일 경우 블록 어드레스(X$BH.ADDR) 정보

1. Session #1에서 다음과 같은 쿼리를 실행합니다.

Session #1

drop table t1 purge;
create table t1(c1 number, c2 number);
insert into t1 select level, level from dual connect by level <= 10000;

select
/*+ ordered use_nl(b) */
a.c1, b.c1
from 
t1 a, t1 b
;



2. TPack Session에서 Session #1의 래치 획득 상황을 분석해보면 다음과 같은 리포트를 얻을 수 있습니다.
(이때 HELD_TIME, AVG_HELD_TIME은 Milli-Second 단위입니다)

TPack Session

SQL> select * from table(tpack.latch_profile_report(&sid1, 'LATCH_NAME, LATCH_ADDR, CODE_NAME, OBJ_WHY, SQL_ID'));

 SID LATCH_NAME           LATCH_AD CODE_NAME                     SQL_ID        OBJ_WHY                HELD_PCT  HELD_TIME AVG_HELD_TIME
---- -------------------- -------- ----------------------------- ------------- -------------------- ---------- ---------- -------------
 147 cache buffers chains 3388518C kcbgtcr: fast path (cr pin)   ch0d1zvc1n8rd 4/784                         0         .4            .1
 147 cache buffers chains 3387D80C kcbgtcr: fast path (cr pin)   ch0d1zvc1n8rd 4/782                         0         .3            .1
 147 cache buffers chains 33EE1C98 kcbgtcr: fast path (cr pin)   ch0d1zvc1n8rd 4/781                         0         .3            .1
 147 cache buffers chains 3387D28C kcbgtcr: fast path (cr pin)   ch0d1zvc1n8rd 4/748                         0         .1            .1
 147 cache buffers chains 3389150C kcbgtcr: fast path (cr pin)   ch0d1zvc1n8rd 4/783                         0         .1            .1
 147 cache buffers chains 3389320C kcbgtcr: fast path (cr pin)   ch0d1zvc1n8rd 4/775                         0         .1            .1
 147 session idle bit     345566E8 ksupuc: clear busy            ch0d1zvc1n8rd          35945354             0         .1            .1


Wait Profile Report

  • Wait Profile Report는 V$SESSION_WAIT 뷰를 프로파일링해서 특정 세션의 대기 이벤트 정보를 집계해서 보여줍니다. 
  • 10046 트레이스 파일에서 대기 이벤트 정보를 추출해서 보여주는 기능도 포함되어 있습니다. 

1. Session #1에서 아래와 같이 ALL_OBJECTS 뷰를 조회합니다.

Session #1

TPACK@ukja1021> exec dbms_application_info.set_client_info('SESSION1');

PL/SQL procedure successfully completed.

TPACK@ukja1021> alter system flush buffer_cache;

System altered.

TPACK@ukja1021> select count(*) from all_objects;
....



2. TPack Session에서 Session #1에 대해 P1에 대해 대기 이벤트를 프로파일링해서 분석합니다. 

TPack Session

TPACK@ukja1106> select sid from v$session where client_info = 'SESSION1';

       SID
----------
       141

TPACK@ukja1106> select * from table(tpack.wait_profile_report(&sid, null, 'p1'));

       SID EVENT_NAME
---------- ----------------------------------------------------------------
        P1         P2         P3   WAIT_PCT  WAIT_TIME AVG_WAIT_TIME
---------- ---------- ---------- ---------- ---------- -------------
       141 db file sequential read
         1                             60.2     3010.4          24.4

       141 db file scattered read
         1                              7.6      384.1          22.5


Elapsed: 00:00:05.43


3. 10046 트레이스 파일(레벨 8 이상)에서 대기 이벤트를 추출해서 분석할 수 있습니다.

TPack Session

TPACK@ukja1106> select * from table(tpack.wait_file_report('c:\temp\test.trc', null, null));

       SID EVENT_NAME
---------- ----------------------------------------------------------------
        P1         P2         P3   WAIT_PCT  WAIT_TIME AVG_WAIT_TIME
---------- ---------- ---------- ---------- ---------- -------------
         0 SQL*Net message from client
                                       87.1  24906.292       8302.09

         0 db file sequential read
                                       10.6   3044.235          3.12

         0 db file scattered read
                                        2.2    643.194           2.8


       SID EVENT_NAME
---------- ----------------------------------------------------------------
        P1         P2         P3   WAIT_PCT  WAIT_TIME AVG_WAIT_TIME
---------- ---------- ---------- ---------- ---------- -------------
         0 SQL*Net message to client
                                          0       .017             0



Diagnostics Event Report

  • Diagnostics Event Report는 10046, 10053과 같은 진단 이벤트를 수행하고 그 결과로 기록되는 트레이스 파일을 자동으로 수집해서 보여주는 리포트입니다.
  • 10046 진단 이벤트의 경우
    TKPROF의 결과를 바로 얻을 수도 있습니다. 

1. Session #1에서 아래와 같이 장시간 실행되는 작업을 수행합니다.

Session #1

declare
v_cnt number;
begin
for idx in 1 .. 100 loop
execute immediate 'select count(*) from t1' into v_cnt;
dbms_lock.sleep(1);
end loop;
end;
/


2. TPack Session에서 총 5번의 10046 진단 이벤트를 1초 단위로 수집합니다. 

TPack Session

SQL> exec tpack.begin_diag_trace(&sid1, 10046, 1);
SQL> exec dbms_lock.sleep(1);
SQL> exec tpack.end_diag_trace(&sid1, 10046);
SQL> select * from table(tpack.get_diag_trace(&sid1, 'TKPROF'));
-- 위의 작업을 총 5번 수행

-- 또는 다음과 같이 한번에

SQL> select * from table(tpack.get_diag_trace_oneshot(&sid1, 10046, 1, 5, 1, 'TKPROF'));

********** 1th trace **********

SQL ID : 5bc0v4my7dvr5
select count(*)
from
 t1


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.05          0         25          0           0
Execute      2      0.00       0.00          0          0          0           0
Fetch        2      0.00       0.00          0         46          0           2
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        5      0.00       0.05          0         71          0           2

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 113     (recursive depth: 1)

Rows     Row Source Operation
-------  ---------------------------------------------------
      1  SORT AGGREGATE (cr=23 pr=0 pw=0 time=0 us)
  10000   TABLE ACCESS FULL T1 (cr=23 pr=0 pw=0 time=155 us cost=9 size=0 card=10000)


********** 2th trace **********

select count(*)
from
 t1


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        0      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        1      0.00       0.00          0         23          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2      0.00       0.00          0         23          0           1

Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 113     (recursive depth: 1)


********** 3th trace **********

select count(*)
from
 t1


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        0      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        1      0.00       0.00          0         23          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2      0.00       0.00          0         23          0           1

Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 113     (recursive depth: 1)


********** 4th trace **********

select count(*)
from
 t1


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        0      0.00       0.00          0          0          0           0
Execute      2      0.00       0.00          0          0          0           0
Fetch        2      0.00       0.00          0         46          0           2
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        4      0.00       0.00          0         46          0           2

Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 113     (recursive depth: 1)


********** 5th trace **********

select count(*)
from
 t1


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        0      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        1      0.00       0.00          0         23          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2      0.00       0.00          0         23          0           1

Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 113     (recursive depth: 1)



Dump
Report

  • Dump Report는 Process State Dump, System State Dump, Hang Analyze, Index Tree Dump 등의 덤프를 자동으로 수행하고 해당 덤프 파일의 내용을 읽는 Report입니다.
  • 대량의 덤프 파일을 읽고 로드하는 작업의 부하가 크기 때문에 테스트 용도로만 사용을 권장합니다. 
  • GET_WHOLE_CONTENTS 파라미터의 값을 '0'으로 지정하면 덤프 파일을 생성만 하고 읽지는 않으므로 운영 환경에서는 이 기능을 이용하는 것을 권장합니다. 

1. 가령 아래와 같이 Hang Analyze 리포트를 바로 얻을 수 있습니다.

Text Box

SQL> select * from table(tpack.hang_analyze);

---- Call Stack Trace -----
calling              call     entry                argument values in hex
location             type     point                (? means dubious value)
-------------------- -------- -------------------- ----------------------------
_skdstdst()+114      CALLrel  _kgdsdst()+0         148DF628 1
_ksedst1()+91        CALLrel  _skdstdst()+0
_ksedst_tracecb()+5  CALLrel  _ksedst1()+0         1 0
3
_ksdxfdmp()+850      CALLreg  00000000             1
_ksdxcb()+1780       CALLptr  00000000             148DFA7C 10 3 148DF93
...



CallStack Profile Report

  • CallStack Profile Report는 CALLSTACK Dump를 이용해서 Oracle 내부의 Function Call을 추적하는 리포트입니다.
  • 특정 세션의 이상 현상을 분석하기 위한 용도로 사용됩니다.

1. Session #1이 다음과 같이 장시간의 작업을 수행합니다.

Session #1

select
count(*)
from 
t1 a, t1 b, t1 c
;


2. TPack Session에서 1초 동안 10번의 CALLSTACK Dump를 수행하고 그 결과를 리포트합니다. qer* 류의 함수는 Query Execute Rowsource 류의 함수로 데이터를 Fetch하고 있다는 것을 의미합니다.

TPack Session

SQL> select * from table(tpack.callstack_prof_report(&sid1));


STACK_TRACE
--------------------------------------------------------------------------------
   HIT_CNT    HIT_PCT
---------- ----------
00000000
 ->7C80B710
  ->_OracleThreadStart@4()
   ->_opimai()
    ->_opimai_real()
     ->_sou2o()
      ->_opidrv()
       ->_opiodr()
        ->_opiino()
         ->_opitsk()
          ->_ttcpip()
           ->_opiodr()
            ->_kpoal8()
             ->_opifch2()
              ->_qergsFetch()
               ->_qerjotFetch()
                ->_qersoFetch()
                 ->_sorgetqbf()
                  ->_smbget()
                   ->_smbqb1tp()
                    ->00000000
                     ->7C80B710
                      ->_OracleOradebugThreadStart@4()
                       ->_ssthreadsrgruncallback()
                        ->_ksdxcb()
                         ->_ksdxfdmp()
                          ->_ksedst_tracecb()
                           ->_ksedst1()
                            ->_skdstdst()
         2         20

00000000
 ->7C80B710
  ->_OracleThreadStart@4()
   ->_opimai()
    ->_opimai_real()
     ->_sou2o()
      ->_opidrv()
       ->_opiodr()
        ->_opiino()
         ->_opitsk()
          ->_ttcpip()
           ->_opiodr()
            ->_kpoal8()
             ->_opifch2()
              ->_qergsFetch()
               ->_qerjotFetch()
                ->_qersoFetch()
                 ->_rworupo()
                  ->00000000
                   ->7C80B710
                    ->_OracleOradebugThreadStart@4()
                     ->_ssthreadsrgruncallback()
                      ->_ksdxcb()
                       ->_ksdxfdmp()
                        ->_ksedst_tracecb()
                         ->_ksedst1()
                          ->_skdstdst()
         2         20
...


System Call Report

  • System Call Report는 strace(Linux), truss(Solaris/AIX), tusc(HP-UX)등의 System Call Tracer를 이용해서 System Call에 의한 문제를 분석하기 위한 리포트를 제공합니다.
  • strace, truss, tusc등의 Command가 존재하지 않거나, Windows 환경인 경우에는 제공되지 않습니다.

1. Session #1에서 아래와 같이 장시간의 작업을 수행합니다.

Session #1

declare
v_cnt number;
begin
for idx in 1 .. 100 loop
execute immediate 'select count(*) from t1' into v_cnt;
dbms_lock.sleep(1);
end loop;
end;
/


2. TPack Session에서 5초 동안 Summary된 System Call Report를 보고합니다.

TPack Session

SQL> select * from table(tpack.system_call_report(&sid1, 5, 'SUMMARY'));

COLUMN_VALUE
--------------------------------------------------------------------------------
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 62.54    0.000182           3        65           gettimeofday
 30.58    0.000089           2        37           getrusage
  5.15    0.000015           1        11           times
  1.72    0.000005           1         5         5 semtimedop
------ ----------- ----------- --------- --------- ----------------
100.00    0.000291                   118         5 total


Heap Analysis Report

  • Heap Analysis Report는 Heap Dump의 결과를 지능적으로 분석해서, PGA나 SGA의 메모리 릭에 의한 성능 저하 및 ORA-4030, 4031 에러의 원인을 추적하기 위해 사용됩니다.
  • Oracle 10gR2부터 지원되는 Automatic Subheap Dump 기능을 사용해서 Top Level의 Heap이나 Sub Level의 Heap까지 모두 분석할 수 있습니다.
  • SGA Heap Analysis의 경우에는 인스턴스에 치명적인 영향을 줄 수 있기 때문에 최후의 수단이나 테스트 환경에서 사용되어야 합니다. 일차적으로 SGA Stat Report를 사용하고 그 후의 추가적인 분석을 위해 SGA Heap Analysis Report를 사용해야 합니다.

1. Session#1에서 아래와 같이 대량의 메모리(PGA)를 소비하는 작업을 수행합니다.

Session #1

declare
type varchar2_array is table of varchar2(32767) index by pls_integer;
vc varchar2_array;
v varchar2(32767);
begin
for idx in 1 .. 10000 loop
v := rpad('x',32767,'x');
vc(idx) := v;
end loop;
tpack.wait_for_signal;
end;
/



2. TPack Session에서 PGA Heap Analysis Report를 모든 Sub Level의 Heap을 포함(2)해서 리포트합니다. pga heap -> koh-kghu call -> pl/sql vc2 오브젝트가 390MB 정도의 메모리를 소비하고 있다는 것을 알 수 있습니다. 

TPack Session

SQL> select * from table(tpack.pga_heap_report(&sid1, 2));

TYPE     HEAP_NAME            ITEM                 ITEM_COUNT  ITEM_SIZE  HEAP_SIZE      RATIO
-------- -------------------- -------------------- ---------- ---------- ---------- ----------
HEAP     pga heap                                           0     626.82     626.82        100
HEAP       diag pga                                         0        .04        .04        100
HEAP       Alloc environm                                   0        .01        .01        100
HEAP         Alloc server h                                 0          0          0        100
HEAP       PLS non-lib hp                                   0        .01        .01        100
HEAP       koh-kghu call                                    0     390.74     390.74        100
HEAP       joxp heap                                        0       1.63       1.63        100
HEAP         joxu pga heap                                  0       1.63       1.63        100
HEAP     top call heap                                      0        .24        .24        100
HEAP       callheap                                         0        .22        .22        100
HEAP         joxcx callheap                                 0        .21        .21        100
HEAP       callheap                                         0          0          0        100
HEAP     top uga heap                                       0        .49        .49        100
HEAP       session heap                                     0        .49        .49        100
HEAP         koh-kghu sessi                                 0        .03        .03        100
HEAP         koh-kghu sessi                                 0        .07        .07        100
HEAP         koh-kghu sessi                                 0        .08        .08        100
HEAP         koh-kghu sessi                                 0        .02        .02        100
HEAP         koh-kghu sessi                                 0        .02        .02        100
CHUNK    pga heap             recreate                      9          0      626.8          0
CHUNK    pga heap             freeable                  10048      392.6      626.8       62.6
CHUNK    pga heap             free                      10010        234      626.8       37.3
CHUNK    pga heap             perm                         14          0      626.8          0
CHUNK      diag pga           free                          3          0          0         .5
CHUNK      diag pga           freeable                    124          0          0       92.9
...
CHUNK      PLS non-lib hp     freeable                      4          0          0       93.1
CHUNK      koh-kghu call      freeable                  10001      390.7      390.7        100
CHUNK    top uga heap         freeable                      7         .4         .4       87.4
CHUNK    top uga heap         recreate                      1          0         .4       12.4
CHUNK    top uga heap         free                          8          0         .4          0
CHUNK      session heap       freeable                    415         .3         .4       74.2
...
CHUNK      callheap           free                          1          0          0        100
OBJECT   pga heap             sdbgrf: iosb                  1          0      626.8          0
OBJECT   pga heap             KGNFS pcontext                1          0      626.8          0
...
OBJECT   pga heap             koh-kghu call             10001      390.9      626.8       62.3
OBJECT   pga heap             KFK_IO_SUBHEAP                1          0      626.8          0
OBJECT   pga heap             none                      10010        234      626.8       37.3
OBJECT   pga heap             bcheapd_kdlwpga               1          0      626.8          0
OBJECT   pga heap             koh-kghu call h               2          0      626.8          0
...
OBJECT     koh-kghu call      pmucalm coll                  1          0      390.7          0
OBJECT     koh-kghu call      pl/sql vc2                10000      390.7      390.7       99.9
OBJECT   top uga heap         none                          8          0         .4          0
OBJECT   top uga heap         session heap                  8         .4         .4       99.9
OBJECT     session heap       kwqb context me               2          0         .4          0
OBJECT     session heap       kxs-krole                     8          0         .4         .1




Extended SGASTAT Report

  • Extended SGASTAT Report는 V$SGASTAT 뷰의 확장된 정보를 제공하는 리포트입니다. 즉 Subpool레벨의 SGA Stat 정보를 보여줍니다. 
  • ORA-4031에러가 발생하면 Oracle은 4031 진단 트레이스 파일을 남깁니다. 이 트레이스 파일을 읽어서 SGA Stat Report를 추출할 수도 있습니다.
1. Subpool 정보가 포함된 SGA Stat 정보를 리포트합니다. Subpool 불균형에 의한 ORA-4031 문제를 분석할 때 유용합니다.

TPack Session

SQL> select * from table(tpack.sga_stat);

   POOLIDX POOL         NAME                               MBYTES        PCT
---------- ------------ ------------------------------ ---------- ----------
        -1 total        -                                     100        100
         1 shared pool  -                                      28      27.99
         2 shared pool  -                                      28      27.99
         3 shared pool  -                                      16      15.99
         4 shared pool  -                                      28         28
         1 shared pool  free memory                          5.57      19.91
         1 shared pool  KSFD SGA I/O b                       3.79      13.54
         1 shared pool  sql area                             2.28       8.16
         1 shared pool  ASH buffers                             2       7.14
         1 shared pool  KQR M PO                             1.57       5.62
          ...
         2 shared pool  row cache                            2.02       7.24
         2 shared pool  PL/SQL DIANA                         1.54       5.51
         2 shared pool  library cache                        1.31       4.71
         2 shared pool  KSXR receive buffers                  .98       3.52
         2 shared pool  Heap0: KGL                            .95        3.4
         2 shared pool  KGLS heap                             .89        3.2
          ...
         3 shared pool  free memory                          9.46      59.14
         3 shared pool  KSXR pending messages que              .8       5.02
         3 shared pool  returns from metrics req              .72       4.52
         3 shared pool  library cache                         .51       3.22
         3 shared pool  db_block_hash_buckets                  .5       3.12
          ...
         4 shared pool  free memory                          6.41       22.9
         4 shared pool  KCB Table Scan Buffer                3.79      13.55
         4 shared pool  sql area                              2.4       8.58
         4 shared pool  ASH buffers                             2       7.14
         4 shared pool  row cache                            1.53       5.48
          ...
          
          


2. ORA-4031 에러 발생시 기록된 트레이스 파일에서도 동일한 정보를 추출할 수 있습니다. 

TPack Session

SQL> select * from table(tpack.sga_stat_4031('c:\ukja1106_fbda_1212.trc'));

   POOLIDX POOL         NAME                               MBYTES        PCT
---------- ------------ ------------------------------ ---------- ----------
        -1 total        -                                     100        100
         1 diag pool    -                                      24         24
         2 diag pool    -                                      24      23.99
         3 diag pool    -                                      32      31.99
         4 diag pool    -                                      20      19.99
         1 diag pool    KSFD SGA I/O b                       3.79       15.8
         1 diag pool    PL/SQL DIANA                         2.43      10.12
         1 diag pool    free memory                          2.09       8.72
         1 diag pool    PL/SQL MPCODE                        2.08       8.67

History Report 관리

History Report 보기

대부분의 리포트 추출 함수는 STORE_TO_TABLE 파라미터를 가지고 있습니다. 이 파라미터 값이 "1"이면 리포트의 결과를 TPACK_RESULT_XXX(XXX=Return 타입) 테이블에 저장합니다. 이것을 History Report라고 부릅니다. 

History Report는 XXX_HISTORY_REPORT 류의 함수를 이용해 볼 수 있습니다. 즉 TPACK.PGA_HEAP_REPORT 함수에 의해 생성된 History Report는 HEAP_HISTORY_REPORT 함수를 통해 조회합니다.

가령 아래와 같이 TPACK.PGA_HEAP_REPORT 함수를 호출하면 그 리포트의 결과가 TPACK_RESULT_HEAP_DUMP 테이블에 저장됩니다. TPACK.PGA_HISTORY_REPORT 함수를 이용하면 이 테이블에 저장된 리포트를 볼 수 있습니다.

History Report

-- 현재 시점에서 PGA Heap Report 얻기
SQL> select * from table(tpack.pga_heap_report);

TYPE      HEAP_NAME            ITEM                 ITEM_COUNT  ITEM_SIZE  HEAP_SIZE      RATIO
--------- -------------------- -------------------- ---------- ---------- ---------- ----------
HEAP      pga heap                                           0       8.97       8.97        100
HEAP      top call heap                                      0        .31        .31        100
HEAP      top uga heap                                       0       1.68       1.68        100
CHUNK     pga heap             perm                         15         .1        8.9        1.6
CHUNK     pga heap             free                         20         .4        8.9        4.9
....
FREE      top call heap        (32768~65536)                 1          0         .3       17.5

85 rows selected.

-- 바로 직전에 수행한 리포트 다시 보기
SQL> select * from table(tpack.heap_history_report);

TYPE      HEAP_NAME            ITEM                 ITEM_COUNT  ITEM_SIZE  HEAP_SIZE      RATIO
--------- -------------------- -------------------- ---------- ---------- ---------- ----------
HEAP      pga heap                                           0       8.97       8.97        100
HEAP      top call heap                                      0        .31        .31        100
HEAP      top uga heap                                       0       1.68       1.68        100
CHUNK     pga heap             perm                         15         .1        8.9        1.6
CHUNK     pga heap             free                         20         .4        8.9        4.9
....
FREE      top call heap        (32768~65536)                 1          0         .3       17.5

85 rows selected.


복수 개의 History Report 저장하기

History Report는 리포트의 JOB ID별로, 리포트의 리턴 타입(TPACK_RESULT_XXX 테이블)별로 최근 하나씩만 보관됩니다. JOB ID는 티팩 라이브리러가 최초로 사용될 때 기본값을 부여받습니다. 

만일 복수 개의 History Report를 보관하려면 CREATE_JOB_ID 함수를 이용해서 별도의 JOB ID를 생성한 다음 리포트 함수를 호출하면 됩니다. 

복수 개의 History Report

-- CREATE_JOB_ID를 이용하면 원하는 개수만큼 History Report를 저장할 수 있음

SQL> col job_id1 new_value job_id1
SQL> select tpack.create_job_id as job_id1 from dual;

JOB_ID1
----------------------------
TPACK$$1:148:1952852863

SQL> select * from table(tpack.pga_heap_report);

TYPE      HEAP_NAME            ITEM                 ITEM_COUNT  ITEM_SIZE  HEAP_SIZE      RATIO
--------- -------------------- -------------------- ---------- ---------- ---------- ----------
HEAP      pga heap                                           0        9.1        9.1        100
HEAP      top call heap                                      0        .93        .93        100
HEAP      top uga heap                                       0       1.68       1.68        100
CHUNK     pga heap             perm                         15         .1        9.1        1.6
CHUNK     pga heap             free                         23         .5        9.1        6.1
...
FREE      top call heap        (262144~524288)               2         .6         .9       66.6

86 rows selected.

SQL> col job_id2 new_value job_id2
SQL> select tpack.create_job_id as job_id2 from dual;

JOB_ID2
----------------------------
TPACK$$1:148:1445760269

SQL> select * from table(tpack.pga_heap_report);
...

SQL> col job_id3 new_value job_id3
TPACK@ukja1106> select tpack.create_job_id as job_id3 from dual;

JOB_ID3
----------------------------
TPACK$$1:148:731081668

SQL> select * from table(tpack.pga_heap_report);
...


위의 과정을 통해 저장된 복수 개의 History Report는 JOB ID를 직접 지정하거나 RECENT_JOB_ID 함수를 이용해 원하는 JOB ID를 지정하면 됩니다.

복수 개의 History Report

-- JOB ID 직접 지정
SQL> select * from table(tpack.heap_history_report('&job_id1'));

SQL> select * from table(tpack.heap_history_report('&job_id2'));

SQL> select * from table(tpack.heap_history_report('&job_id3'));

-- 또는 RECENT_JOB_ID 이용
SQL> select * from table(tpack.heap_history_report(tpack.recent_job_id(-2)));

SQL> select * from table(tpack.heap_history_report(tpack.recent_job_id(-1)));

SQL> select * from table(tpack.heap_history_report(tpack.recent_job_id(0)));



History Report 제거하기

PURGE_HISTORY_REPORTS 프로시저를 호출하면 모든 History Report를 삭제합니다. 

History Report 제거

SQL> exec tpack.purge_history_reports;

PL/SQL procedure successfully completed.

SQL> select * from table(tpack.heap_history_report('&job_id1'));

no rows selected


티팩 서버

티팩 서버 기능을 이용하면 특정 세션이 특정 조건을 만족할 때 티팩 리포트를 자동으로 수집할 수 있습니다. 가령 다음과 같은 설정이 가능합니다.
  • 특정 세션의 PGA 사용량이 100M를 넘어서면 Heap Dump를 수행하고 분석 리포트를 생성하라.
  • 특정 세션의 db file sequential read 대기이벤트가 초당 0.5초를 넘어서면 System Call Report를 생성하라.
PGA 크기가 100M를 넘어서면 PGA Heap Dump(Level 0x20000001)를 수행하고 덤프 파일의 이름을 저장하는 작업을 통해서 설명해보겠습니다.

1. 다음과 같이 리포트를 생성합니다. DUMP_LEVEL 파라미터를 0x20000001로 지정함으로써 SubHeap까지 모두 덤프를 수행하도록 합니다. GET_WHOLE_CONTENTS 파라미터를 0으로 지정함으로써 덤프 파일만 생성하고 해당 파일의 내용을 데이터베이스에 저장하지는 않도록 합니다. 데이터베이스에 저장할 경우 부하가 지나치게 크기 때문입니다. 

Create Report

col report_id new_value report_id

select tpack_server.create_report('Heap Dump') as report_id from dual;

exec tpack_server.add_parameter('&report_id', 'dump_level', '0x20000001');
exec tpack_server.add_parameter('&report_id', 'get_whole_contents', 0);

exec tpack_server.add_condition('&report_id', 'STAT', 'session pga memory', '>100000000', 'SUM');

select * from table(tpack_server.report_detail('&report_id'));

exec tpack_server.register_report('&report_id');




2. 리포트를 생성한 후 티팩 서버를 시작합니다.

Start Server

-- start server
exec tpack_server.start_server;



3. PGA 크기가 수백 M이상 증가하는 PL/SQL 블록을 수행합니다. 

Make big PGA assumption

-- make big pga
declare
 type varchar2_array is table of varchar2(32767) index by pls_integer;
 vc  varchar2_array;
 v  varchar2(32767);
begin
 for idx in 1 .. 10000 loop
 v := rpad('x',32767,'x');
 vc(idx) := v;
 end loop;
 
 tpack.wait_for_signal;
end;
/




4. 티팩 서버 로그를 보면 TPACK.HEAP_DUMP 프로시저가 수행되면서 리포트가 성공적으로 저장된 것을 확인할 수 있습니다. 

TPack Server Log

Fri Jun 11 06:27:50 GMT+00:00 2010 : executing report 1:142:1973827792 for session 142
Fri Jun 11 06:27:55 GMT+00:00 2010 : executing report = begin tpack.heap_dump( dump_level=>'0x20000001', get_whole_contents=>0, session_id => 142); end; 
Fri Jun 11 06:27:55 GMT+00:00 2010 : command = prompt <<TRACEFILE_NAME>>
Fri Jun 11 06:27:55 GMT+00:00 2010 : command = oradebug tracefile_name
Fri Jun 11 06:27:55 GMT+00:00 2010 : command string = C:\oracle\product\11.1.0\db_1/bin/sqlplus /nolog @c:\temp/1276237675281.sql
Fri Jun 11 06:27:55 GMT+00:00 2010 : out = 
Fri Jun 11 06:27:55 GMT+00:00 2010 : out = SQL*Plus: Release 11.1.0.6.0 - Production on Fri Jun 11 15:27:55 2010
Fri Jun 11 06:27:55 GMT+00:00 2010 : out = 
Fri Jun 11 06:27:55 GMT+00:00 2010 : out = Copyright (c) 1982, 2007, Oracle. All rights reserved.
Fri Jun 11 06:27:55 GMT+00:00 2010 : out = 
Fri Jun 11 06:27:55 GMT+00:00 2010 : out = Connected.
Fri Jun 11 06:27:55 GMT+00:00 2010 : out = Oracle pid: 22, Windows thread id: 5556, image: ORACLE.EXE (SHAD)
Fri Jun 11 06:27:55 GMT+00:00 2010 : out = <<TRACEFILE_NAME>>
Fri Jun 11 06:27:55 GMT+00:00 2010 : out = c:\oracle\diag\rdbms\ukja1106\ukja1106\trace\ukja1106_ora_5556.trc
Fri Jun 11 06:27:55 GMT+00:00 2010 : out = Disconnected from Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
Fri Jun 11 06:27:55 GMT+00:00 2010 : out = With the Partitioning, OLAP, Data Mining and Real Application Testing options
Fri Jun 11 06:27:55 GMT+00:00 2010 : command = oradebug unlimit
Fri Jun 11 06:27:55 GMT+00:00 2010 : command = oradebug dump heapdump 536870913
Fri Jun 11 06:27:55 GMT+00:00 2010 : command string = C:\oracle\product\11.1.0\db_1/bin/sqlplus /nolog @c:\temp/1276237675562.sql
Fri Jun 11 06:27:56 GMT+00:00 2010 : out = 
Fri Jun 11 06:27:56 GMT+00:00 2010 : out = SQL*Plus: Release 11.1.0.6.0 - Production on Fri Jun 11 15:27:55 2010
Fri Jun 11 06:27:56 GMT+00:00 2010 : out = 
Fri Jun 11 06:27:56 GMT+00:00 2010 : out = Copyright (c) 1982, 2007, Oracle. All rights reserved.
Fri Jun 11 06:27:56 GMT+00:00 2010 : out = 
Fri Jun 11 06:27:56 GMT+00:00 2010 : out = Connected.
Fri Jun 11 06:27:56 GMT+00:00 2010 : out = Oracle pid: 22, Windows thread id: 5556, image: ORACLE.EXE (SHAD)
Fri Jun 11 06:27:56 GMT+00:00 2010 : out = Statement processed.
Fri Jun 11 06:27:56 GMT+00:00 2010 : out = Statement processed.
Fri Jun 11 06:27:56 GMT+00:00 2010 : out = Disconnected from Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
Fri Jun 11 06:27:56 GMT+00:00 2010 : out = With the Partitioning, OLAP, Data Mining and Real Application Testing options
Fri Jun 11 06:27:56 GMT+00:00 2010 : success = begin tpack.heap_dump( dump_level=>'0x20000001', get_whole_contents=>0, session_id => 142); end; 



5. 리포트 아이디를 이용해서 Job History 정보를 얻을 수 있고, JOB ID를 이용해서 저장된 내용을 확인합니다. GET_WHOLE_CONTENTS 파라미터 값이 0이므로 트레이스 파일명만 저장된 것을 알 수 있습니다. 이 트레이스 파일을 이용해서 TPACK.HEAP_FILE_REPORT 함수를 호출하면 Heap Anaysis Report를 얻을 수 있습니다. 

Job History

SQL> select report_id, job_id from tpack_report_job_hist
  2  where report_id = '1:142:1973827792';

REPORT_ID            JOB_ID
-------------------- -----------------------------------------------
1:142:1973827792     TPACK_SERVER$$1:127:1199769489


SQL>  select * from table(tpack.get_history_dump('TPACK_SERVER$$1:127:1199769489'));

COLUMN_VALUE
--------------------------------------------------------------------------------

Tracefile Name = c:\oracle\diag\rdbms\ukja1106\ukja1106\trace\ukja1106_ora_5556.trc

Start Position = 0

SQL> select * from table(tpack.heap_file_report('c:\oracle\diag\rdbms\ukja1106\ukja1106\trace\ukja1106_ora_5556.trc'));

...


디버깅



Comments