"index만 탄다고 무조건 좋은건 아니다." 를 보여주는 예제
set timing on //실행시간을 본다
alter session set optimizer_mode = rule; //룰베이스로 동작 시킨다
set autotrace on // 실행계획 보기
SELECT course_code,
nvl(SUM(decode(year,'1999',deposit_amount)),0) Y1999,
nvl(SUM(decode(year,'2000',deposit_amount)),0) Y2000,
nvl(SUM(decode(year,'2001',deposit_amount)),0) Y2001,
nvl(SUM(decode(year,'2002',deposit_amount)),0) Y2002
FROM EC_APPLY
WHERE course_code < 1000
GROUP by course_code;
Elapsed: 00:00:10.72
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=RULE
1 0 SORT (GROUP BY)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'EC_APPLY'
3 2 INDEX (RANGE SCAN) OF 'EC_APPLY_PK' (UNIQUE)
위에서 유니크 인덱스를 잘 타고 있지만 건수가 1000건 가량 워낙 많아서
인덱스를 태우는것보다 풀테이블 스캔이 낫다고 판단
튜닝 후 인덱스 태울때보다 풀 테이블 스캔 이 더빠르다
SELECT /*+FULL(EC_APPLY) */ course_code,
nvl(SUM(decode(year,'1999',deposit_amount)),0) Y1999,
nvl(SUM(decode(year,'2000',deposit_amount)),0) Y2000,
nvl(SUM(decode(year,'2001',deposit_amount)),0) Y2001,
nvl(SUM(decode(year,'2002',deposit_amount)),0) Y2002
FROM EC_APPLY
WHERE course_code < 1000
GROUP by course_code;
Elapsed: 00:00:01.46
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=RULE (Cost=2051 Card=100 Bytes=32
00)
1 0 SORT (GROUP BY) (Cost=2051 Card=100 Bytes=3200)
2 1 TABLE ACCESS (FULL) OF 'EC_APPLY' (Cost=2047 Card=100 By
tes=3200)
위에 플랜을 보면 cost가 2047인데 역시 건수가 많다
풀테이블 스캔이 하니 1초로 뚝딱 으헤헤
'DB > SQL 튜닝' 카테고리의 다른 글
SQL튜닝 Oracle autotrace를 이용하여 실행계획 보기 (0) | 2021.01.03 |
---|---|
인덱스 리빌드(index rebuild) 성능개선의 원리!! (0) | 2021.01.01 |
댓글