스냅샷 데이터와 리포트를 만드는 기본적인 방법
스냅샷 데이터와 리포트를 만드는 간단한 예제
/**
-- STEP1. 우선 다음과 같이 V$SYSSTAT뷰에 대한 스냅샷을 만듬
-- 1) V$SYSSTAT뷰의 내용을 테이블 SYSSTAT1에 저장함으로써 스냅샷을 만들수 있음
**/
SQL> create table sysstat1 as select * from v$sysstat;
테이블이 생성되었습니다.
-- STEP2. 그리고 ALL_OBJECTS뷰를 읽는 작업을 수행함
SQL> select count(*) from all_objects;
COUNT(*)
----------
60078
-- STEP3. 다음으로 두번째 스냅샷을 테이블 SYSSTAT2에 만듬
SQL> create table sysstat2 as select * from v$sysstat;
테이블이 생성되었습니다.
/**
-- STEP4. 스냅샷 간의 차이 값이야말로 두 개의 스냅샷에 해당하는 구간(시간 스냅샷~ 끝 스냅샷)에서 어떤 일이 발생했는지를 말해주기 때문임
-- 1) 아래와 같이 두개의 스냅샷, 테이블 SYSSTAT2 와 SYSSTAT1간의 차이(Delta)값을 구함으로써 어떤 변화가 있었는지 알수 있음
-- 2) 아래의 스냅샷 리포트로부터 얻을수 있는 결론 중 하나는 ALL_OBJECTS 뷰를 읽는 작업에 의해 Physical Reads가 2M 바이트 이상 발생한다는 것임
**/
SQL> -- get delta
SQL> col name format a40
SQL> col delta format 999,999,999,999
SQL> select s1.name , (s2.value - s1.value) as delta
2 from sysstat1 s1, sysstat2 s2
3 where s1.statistic# = s2.statistic#
4 and (s2.value - s1.value) > 0
5 order by 2 desc;
NAME DELTA
---------------------------------------- ----------------
session pga memory max 18,219,008
cell physical IO interconnect bytes 3,028,480
session uga memory max 2,741,368
physical read total bytes 2,383,872
physical read bytes 1,564,672
file io wait time 665,853
physical write total bytes 644,608
session pga memory 196,608
session uga memory 80,680
index scans kdiixs1 69,669
table scan rows gotten 68,216
.... (중략)
AWR리포트를 생성하는 방법
AWR스냅샷을 생성 후 스냅샷간의 차이값을 리포팅하는 예제
-- STEP1. DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT함수를 이용해 스냅샷A 를 만듬
SQL> -- 1st snapshot
SQL> col begin_snap new_value begin_snap;
SQL> col db_id new_value db_id;
SQL> col inst_num new_value inst_num;
SQL> select dbid as db_id from v$database;
DB_ID
----------
84928337
SQL> select instance_number as inst_num from v$instance;
INST_NUM
----------
1
SQL> select dbms_workload_repository.create_snapshot as begin_snap from dual;
BEGIN_SNAP
----------
5
-- STEP2. ALL_OBJECTS뷰를 읽는 작업을 수행함
SQL> select count(*) from all_objects;
COUNT(*)
----------
60080
-- STEP3. 스냅샷 B를 만듬
SQL> -- 2nd snapshot
SQL> col end_snap new_value end_snap;
SQL> select dbms_workload_repository.create_snapshot as end_snap from dual;
END_SNAP
----------
6
-- STEP4. DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_TEXT[_HTML]함수를 이용해서 스냅샷 B와 스냅샷 A간의 차이점을 리포팅함
SQL> -- AWR report
SQL> select * from table(dbms_workload_repository.awr_report_text(&db_id, &inst_num, &begin_snap, &end_snap));
Top 5 Timed Foreground Events
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OUTPUT
--------------------------------------------------------------------------------
Avg
wait % DB
Event Waits Time(s) (ms) time Wait Class
------------------------------ ------------ ----------- ------ ------ ----------
DB CPU 1 49.3
db file sequential read 80 0 5 29.8 User I/O
control file sequential read 89 0 2 10.7 System I/O
db file scattered read 4 0 3 .8 User I/O
Disk file operations I/O 1 0 1 .1 User I/O
Host CPU (CPUs: 2 Cores: 2 Sockets: 1)
... (중략)
왜? 스냅샷은 다양한 방식으로 사용할수 있는 차이점이 존재하는가
PGA의 크기가 계속증가하면서 세션의 성능이 저하되는 현상
이런 경우에 사용할수 잇는 것이 PGA 힙 덤프임
PGA힙 덤프를 수행하는 예제
-- STEP1. PGA힙 덤프 수행
SQL> -- every dump is snapshot data!!!
SQL> alter session set events 'immediate trace name heapdump level 1';
세션이 변경되었습니다.
-- STEP2. 현재 프로세스의 PGA힙 정보가 트레이스 파일에 기록됨
HEAP DUMP heap name="pga heap" desc=0BBC9830
extent sz=0x206c alt=108 het=32767 rec=0 flg=3 opc=2
parent=00000000 owner=00000000 nex=00000000 xsz=0xfff8 heap=00000000
fl2=0x60, nex=00000000
EXTENT 0 addr=0D230008
Chunk d230010 sz= 65520 free " "
EXTENT 1 addr=0D220008
Chunk d220010 sz= 1628 freeable "diag pga " ds=0CEE04C0
Chunk d22066c sz= 4164 freeable "diag pga " ds=0CEE04C0
Chunk d2216b0 sz= 4164 freeable "diag pga " ds=0CEE04C0
Chunk d2226f4 sz= 8224 freeable "PLS PGA hp " ds=08AE8EA8
Chunk d224714 sz= 2096 freeable "PLS PGA hp " ds=08AE8EA8
Chunk d224f44 sz= 8284 recreate "PLS PGA hp " latch=00000000
PGA 힙 덤프와 같은 덤프 데이터는 가장 자세한 형태의 스냅샷 데이터라고 볼수 있음
이런 종류의 스냅샷 데이터는 지나치게 정밀하기 때문에 다른 종류의 스냅샷 데이터 처럼 차이(Delta)값을 구하는 것이 어려우며 큰 의미도없고 사용시 적절한 형태로 집계할 필요가 있음
- 강좌 URL : http://www.gurubee.net/lecture/4288
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.