DB/SQL튜닝

업무에 바로 쓰는 SQL튜닝 입문 - 5교시(인덱스활용불가) - 문제

Kang_hobin 2022. 9. 26. 22:52

이건 진짜 몰랐다. 바로 답안을 확인했다.
WHERE 절에 기술된 조건에 의해 PK가 인덱스로 사용되고 있는데 처리한 데이터가 전체 데이터 중에서 15%를 초과해서 인덱스를 사용하는 것 자체가 속도가 저하된다 한다.
.. 15%를 초과하는지 어떻게 알았던 걸까.. 그냥 모를수밖에 없는 거 였는듯..

..바로 정답을 봤다..
GROUP BY COURSE_CODE, YEAR를 추가하는 서브쿼리를 넣었다.
/*+ NO_USE_HASH_AGGREGATION */.. aggreation시 해싱대신 소팅을 하게끔 할려면 쓴다고 한다.. 아직 잘 모르겠다.

답은 다음과 같았다.
SELECT /*+ FULL(EC_APPLY) */
              COURSE_CODE, YEAR, SUM(DEPOSIT_AMOUNT) DEPOSIT_AMOUNT
  FROM EC_APPLY
WHERE COURSE_CODE < 1000
    AND YEAR BETWEEN '1999' AND '2002'
 GROUP BY COURSE_CODE, YEAR

GROUP BY를 함수(DECODE) 사용 전에 먼저 적용시켜서 데이터를 추리는게 답이라 한다.
저 안의 정답(서브쿼리)를 INLINE VIEW라고 부른다고 함.
/*+FULL(EC_APPLY) */를 사용하면서 인덱스를 못쓰게 해버리는 것임. FULLSCAN!
그러면서 SUM을 먼저 하도록 GROUP BY COURSE_CODE, YEAR를 하는것임!
...이걸 실무에서 어떻게 판단해야할지... 
침고! 10g 부터 GROUP BY의 매커니즘이 변경됨. Sorting에서 Hashing!! 으로 !!