현재 데이터 베이스의 모든 건수를 알고 싶을 때.
프로그래밍 2008. 4. 22. 18:45 |EXEC DBMS_STATS.gather_schema_stats(USER, cascade=> TRUE);
SELECT table_name, num_rows FROM user_tables;
현재 User의 모든 테이블에 대한 통계정보를 조사하고 나면 num_rows에 값이 들어가있게 됨.
EXEC DBMS_STATS.gather_schema_stats(USER, cascade=> TRUE);
SELECT table_name, num_rows FROM user_tables;
현재 User의 모든 테이블에 대한 통계정보를 조사하고 나면 num_rows에 값이 들어가있게 됨.
조인방식이 HASH JOIN -> NESTED LOOP JOIN으로
데이타 엑섹스 경로는 FULL SCAN -> INDEX (RANGE SCAN) 으로 변경
튜닝전 Execution Plan (인덱스 생성 전 )
--------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=92 Card=1 Bytes=105)
1 0 SORT (GROUP BY) (Cost=92 Card=1 Bytes=105)
2 1 VIEW (Cost=86 Card=1 Bytes=105)
3 2 SORT (GROUP BY) (Cost=86 Card=1 Bytes=183)
4 3 HASH JOIN (Cost=79 Card=1 Bytes=183)
5 4 HASH JOIN (Cost=76 Card=1 Bytes=115)
6 5 TABLE ACCESS (BY INDEX ROWID) OF 'table a' (Cost=1 Card=1 Bytes=65)
7 6 INDEX (SKIP SCAN) OF 'table a' (UNIQUE) (Card=1)
8 5 TABLE ACCESS (FULL) OF 'table b' (Cost=74 Card=1 Bytes=50)
9 4 TABLE ACCESS (FULL) OF 'table c' (Cost=2 Card=1 Bytes=68)
CREATE INDEX [user 계정].[생성 INDEX명] ON [user 계정].[table b]([column x], [column y])
TABLESPACE [table space명];
튜닝후 Execution Plan (인덱스 생성 후 )
--------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=19 Card=1 Bytes=105)
1 0 SORT (GROUP BY) (Cost=19 Card=1 Bytes=105)
2 1 VIEW (Cost=13 Card=1 Bytes=105)
3 2 SORT (GROUP BY) (Cost=13 Card=1 Bytes=183)
4 3 HASH JOIN (Cost=6 Card=1 Bytes=183)
5 4 TABLE ACCESS (BY INDEX ROWID) OF 'table b' (Cost=2 Card=1 Bytes=50)
6 5 NESTED LOOPS (Cost=3 Card=1 Bytes=115)
7 6 TABLE ACCESS (BY INDEX ROWID) OF 'table a' (Cost=1 Card=1 Bytes=65)
8 7 INDEX (SKIP SCAN) OF 'PK_table a' (UNIQUE) (Card=1)
9 6 INDEX (RANGE SCAN) OF '[생성 INDEX명]' (NON-UNIQUE) (Cost=1 Card=1)
10 4 TABLE ACCESS (FULL) OF 'table c' (Cost=2 Card=1 Bytes=68)
무려 92에서 19로의 드라마틱한 퍼포먼스 향상.
이런 엄청난 차이라니. 공부해서 남주나요.