본문 바로가기
DB/SQL 튜닝

SQL튜닝 Oralce INDEX SCAN-> FULL TABLE SCAN 튜닝

by 애플 로그 2021. 1. 1.
반응형


"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초로 뚝딱 으헤헤

댓글