An expert is a person
who has made all the mistakes that can be made in a very narrow field
A. Trace 관련 체크
[ 샘플 1 ] select b.OWNER, b.SEGMENT_NAME, b.SEGMENT_TYPE, b.BYTES, b.tablespace_name, a.TABLE_NAME, a.NUM_ROWS, a.INITIAL_EXTENT,a.NEXT_EXTENT from scott_tables a, scott_dba_segments b where a.OWNER = b.owner and a.table_name = b.segment_name and a.owner='SCOTT'
Call Count CPU Time Elapsed Time Disk Query Current Rows ------- ------ -------- ------------ ---------- ---------- ---------- ---------- Parse 1 0.030 0.046 0 116 0 0 Execute 1 0.000 0.000 0 0 0 0 Fetch 3 0.000 0.001 0 29 0 20 ------- ------ -------- ------------ ---------- ---------- ---------- ---------- Total 5 0.030 0.047 0 145 0 20 ==> 전체 일량
Misses in library cache during parse: 1 ==> Hard Parse / Sorf Parse [ 여기선 Hard ] Optimizer goal: ALL_ROWS Parsing user: SCOTT (ID=57)
Rows Row Source Operation ------- --------------------------------------------------- 0 STATEMENT 20 HASH JOIN (cr=29 pr=0 pw=0 time=345 us) 15 TABLE ACCESS BY INDEX ROWID SCOTT_TABLES (cr=5 pr=0 pw=0 time=97 us) 15 INDEX RANGE SCAN XAK1_SCOTT_TABLES (cr=2 pr=0 pw=0 time=20 us)(Object ID 53941) 29 TABLE ACCESS BY INDEX ROWID SCOTT_DBA_SEGMENTS (cr=24 pr=0 pw=0 time=191 us) 29 INDEX RANGE SCAN XAK1_SCOTT_DBA_SEGMENTS (cr=4 pr=0 pw=0 time=13 us)(Object ID 53940)
1. XAK1_SCOTT_TABLES INDEX RANGE SCAN 하는데 BLOCK 2개를 읽었고, 20 us 시간이 소요됨 관련 OBJECT_ID = 53941 ( 인덱스 )
2. SCOTT_TABLES 에 INDEX ROWID 를 통해서 ACCESS 하는데 5(3+2) 개의 BLOCK 을 읽었고, 97 us 시간이 소요됨
==> SCOTT_TABLES 관련 ACCESS 시 총 5개의 BLOCK을 읽었고, 총 97 us 시간이 소요됨
3. XAK1_SCOTT_DBA_SEGMENTS INDEX RANGE SCAN 하는데 BLOCK 을 4개 읽고, 13 us 시간이 소요됨 관련 OBJECT_ID = 53940 ( 인덱스 )
4. SCOTT_DBA_SEGMENTS 에 INDEX ROWID 를 통한 ACCESS 하는데 총 24(20+4) 개의 BLOCK 을 읽었고, 191 us 시간이 소요됨
==> SCOTT_DBA_SEGMENTS 관련 ACCESS 시 총 28개의 BLOCK을 읽었고, 총 191 us 시간이 소요됨
5. HASH JOIN 수행시 총 29(5+24) 개의 BLOCK 을 읽고, 345(57+97+191) us 시간이 소요됨
수행 시간 XAK1_SCOTT_TABLES 20 SCOTT_TABLES 77 XAK1_SCOTT_DBA_SEGMENTS 13 SCOTT_DBA_SEGMENTS 178 HASH JOIN 57
[ 샘플 2 ] select /*+ ordered USE_NL(b a) */ a.EMPNO, a.ENAME, a.JOB, b.DEPTNO, b.DNAME from emp a, dept b where a.deptno = b.deptno and a.empno > 7500 and b.dname ='SALES'
Call Count CPU Time Elapsed Time Disk Query Current Rows ------- ------ -------- ------------ ---------- ---------- ---------- ---------- Parse 1 0.010 0.002 0 0 0 0 Execute 1 0.000 0.000 0 0 0 0 Fetch 2 0.000 0.000 0 18 0 5 ------- ------ -------- ------------ ---------- ---------- ---------- ---------- Total 4 0.010 0.002 0 18 0 5
Misses in library cache during parse: 1 Optimizer goal: ALL_ROWS Parsing user: SCOTT (ID=57)
Rows Row Source Operation ------- --------------------------------------------------- 0 STATEMENT 5 NESTED LOOPS (cr=18 pr=0 pw=0 time=56 us) 12 TABLE ACCESS BY INDEX ROWID EMP (cr=4 pr=0 pw=0 time=168 us) 12 INDEX RANGE SCAN PK_EMP (cr=2 pr=0 pw=0 time=109 us)(Object ID 49711) 5 TABLE ACCESS BY INDEX ROWID DEPT (cr=14 pr=0 pw=0 time=102 us) 12 INDEX UNIQUE SCAN PK_DEPT (cr=2 pr=0 pw=0 time=44 us)(Object ID 49709) 1:M 관계이고, Nested Loop 로 12번 연결 작업 ( DEPT 총 ROW 가 5개 임에도 불구하고, 12 ROW ACCESS 한 이유 )
[ 샘플 3]
select a.EMPNO, a.ENAME, a.JOB, b.DEPTNO, b.DNAME from emp a, dept b where a.deptno = b.deptno and a.empno > 7500 and b.dname ='SALES'
Call Count CPU Time Elapsed Time Disk Query Current Rows ------- ------ -------- ------------ ---------- ---------- ---------- ---------- Parse 1 0.000 0.002 0 0 0 0 Execute 1 0.000 0.000 0 0 0 0 Fetch 2 0.000 0.000 0 6 0 5 ------- ------ -------- ------------ ---------- ---------- ---------- ---------- Total 4 0.000 0.002 0 6 0 5 !! 샘플2 와 샘플3 비교시 Query 가 18 --> 6 으로 절대적인 일량이 줄어들었다. 절대적인 일량이 줄어드는 것이 좋은 것이다.
Misses in library cache during parse: 1 Optimizer goal: ALL_ROWS Parsing user: SCOTT (ID=57)
Rows Row Source Operation ------- --------------------------------------------------- 0 STATEMENT 5 MERGE JOIN (cr=6 pr=0 pw=0 time=117 us) 1 TABLE ACCESS BY INDEX ROWID DEPT (cr=4 pr=0 pw=0 time=53 us) 4 INDEX FULL SCAN PK_DEPT (cr=2 pr=0 pw=0 time=19 us)(Object ID 49709) 5 SORT JOIN (cr=2 pr=0 pw=0 time=72 us) 12 TABLE ACCESS BY INDEX ROWID EMP (cr=2 pr=0 pw=0 time=48 us) 12 INDEX RANGE SCAN PK_EMP (cr=1 pr=0 pw=0 time=20 us)(Object ID 49711)
B.Predicate 정보 보는 방법
출처 : 강정식 결론 : 10.1 까지는 Predicate 정보를 보여주지 않는다. 이유를 모르겠네요 10.2 에서부터 Predicate 정보를 보여준다. sql*plus에서 'AUTOTRACE' 명령어를 통해 보실 수 있습니다.
'AUTOTRACE' 구문 Set AUTOTRACE [OFF, ON, TRACE (ONLY)] [EXPLAIN] [STATISTICS]
SQL> set autotrace on : autotrace 설정 SQL> set autotrace traceonly : SQL문 실행과 숨기기 SQL> set autotrace traceonly explain : 통계 정보 조회하지 않고 실행 계획만 조회
[Sample] SQL > set autotrace traceonly explain; SQL > SELECT * FROM DEPT WHERE ROWNUM = 1;
1) 8.1.7.4 Connected to: Oracle8i Enterprise Edition Release 8.1.7.4.0 - Production With the Partitioning option JServer Release 8.1.7.4.0 - Production
SQL> set autotrace traceonly explain; SQL> SELECT * FROM booking where rownum = 1 ;
Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=34950 Card=8844175 B ytes=3882592825) 1 0 COUNT (STOPKEY) 2 1 TABLE ACCESS (FULL) OF 'BOOKING' (Cost=34950 Card=884417 5 Bytes=3882592825) SQL> exit
2)10.1.0.4 Connected to: Oracle Database 10g Enterprise Edition Release 10.1.0.4.0 - 64bit Production With the Partitioning, OLAP and Data Mining options
scott@ARTDOM>set autotrace traceonly explain; scott@ARTDOM>SELECT * FROM DEPT WHERE ROWNUM = 1;
Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=1 Bytes=20) 1 0 COUNT (STOPKEY) 2 1 TABLE ACCESS (FULL) OF 'DEPT' (TABLE) (Cost=2 Card=1 Bytes=20)
scott@ARTDOM>exit
3)10.2.0.3 Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production With the Partitioning, Real Application Clusters, OLAP and Data Mining options
SQL> set autotrace traceonly explain; SQL> select * from bkg_booking where rownum = 1 ;
Execution Plan ---------------------------------------------------------- Plan hash value: 4285486501 ---------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 503 | 2 (0)| 00:00:01 | |* 1 | COUNT STOPKEY | | | | | | | 2 | TABLE ACCESS FULL| BKG_BOOKING | 1 | 503 | 2 (0)| 00:00:01 | ----------------------------------------------------------------------------------
Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(ROWNUM=1)
SQL> exit
4)10.2.0.1 Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production With the Partitioning, OLAP and Data Mining options
SQL> set autotrace traceonly explain; SQL> select * from IMSBLTH6 where rownum = 1 ;
Execution Plan ---------------------------------------------------------- Plan hash value: 1852230962
------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 228 | 2 (0)| 00:00:01 | |* 1 | COUNT STOPKEY | | | | | | | 2 | TABLE ACCESS FULL| IMSBLTH6 | 1 | 228 | 2 (0)| 00:00:01 | -------------------------------------------------------------------------------
Predicate Information (identified by operation id): ---------------------------------------------------
1 - filter(ROWNUM=1)
Connected to: Oracle Database 10g Enterprise Edition Release 10.1.0.4.0 - 64bit Production With the Partitioning, OLAP and Data Mining options
SQL> set autotrace traceonly explain; SQL> select * from I_BL_LOG where rownum = 1 ;
Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=1 Bytes=31) 1 0 COUNT (STOPKEY) 2 1 TABLE ACCESS (FULL) OF 'I_BL_LOG' (TABLE) (Cost=2 Card=1 Bytes=31)
C. Trace 비교 ( 8i VS 10G )
1) 8i
Call Count CPU Time Elapsed Time Disk Query Current Rows ------- ------ -------- ------------ ---------- ---------- ---------- ---------- Parse 1 0.00 0.00 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 9 0.01 0.00 0 1039 0 76 ------- ------ -------- ------------ ---------- ---------- ---------- ---------- Total 11 0.01 0.00 0 1039 0 76
Misses in library cache during parse: 0 Optimizer goal: CHOOSE Parsing user: HANSIS (ID=45)
Rows Row Source Operation ------- --------------------------------------------------- 0 STATEMENT 76 SORT GROUP BY 124 NESTED LOOPS 390 TABLE ACCESS BY INDEX ROWID I_BKG_CUST 390 INDEX RANGE SCAN OF XAK1I_BKG_CUST (NONUNIQUE) 124 INDEX RANGE SCAN OF XAK4I_BOOKING (NONUNIQUE)
2) 10G
Call Count CPU Time Elapsed Time Disk Query Current Rows ------- ------ -------- ------------ ---------- ---------- ---------- ---------- Parse 8 0.000 0.001 0 0 0 0 Execute 8 0.000 0.030 1 3 2 0 Fetch 7 0.000 0.000 0 7 0 0 ------- ------ -------- ------------ ---------- ---------- ---------- ---------- Total 23 0.000 0.032 1 10 2 0
Misses in library cache during parse: 1 Misses in library cache during execute: 1 Optimizer goal: CHOOSE Parsing user: SYS (ID=0) Recursive depth: 1
Rows Row Source Operation ------- --------------------------------------------------- 0 STATEMENT 0 NESTED LOOPS (cr=1 pr=0 pw=0 time=27 us) 0 NESTED LOOPS (cr=1 pr=0 pw=0 time=23 us) 0 TABLE ACCESS BY INDEX ROWID ASSOCIATION$ (cr=1 pr=0 pw=0 time=23 us) 0 INDEX RANGE SCAN ASSOC1 (cr=1 pr=0 pw=0 time=21 us)OF ASSOC1 (UNIQUE) 0 TABLE ACCESS BY INDEX ROWID OBJ$ (cr=0 pr=0 pw=0 time=0 us) 0 INDEX UNIQUE SCAN I_OBJ1 (cr=0 pr=0 pw=0 time=0 us)OF I_OBJ1 (UNIQUE) 0 TABLE ACCESS CLUSTER USER$ (cr=0 pr=0 pw=0 time=0 us) 0 INDEX UNIQUE SCAN I_USER# (cr=0 pr=0 pw=0 time=0 us)OF I_USER# (UNIQUE)
|