4.14 실무에 적용하기

  • 쿼리블럭이 특정 개수보다 많아지면 Best Plan을 구하지 못할 확률이 높아진다
    • 4.4, 4.5장 - 서브쿼리가 2개인 경우 Search Type은 Exhustive 로 항상 최저 Cost를 보장하였다
    • 서브쿼리 개수가 많아지면서 Search Type은 Linear 로 바뀌어 최저 Cost를 보장하지 못한다.
    • 서브쿼리가 7개가 되자 상황이 더욱 나빠졌다. Search Type이 Two_pass 가 되어 최악의 Plan을 만들 수 있다.
  • Simple is Best
    • 서브쿼리 개수 2개 이하 : 최고의 Plan 을, 7개이면 최악의 Plan이 만들어질 가능성이 높다.
    • Complex 서브쿼리는 2개 이하로 SQL을 작성하는 것이 좋다. 안될 경우 6개 이하로 제한하는 것을 고려해야 한다.
      ( 서브쿼리 7개 이상일 때는 조인으로 변경하는 것이 좋다 )
  • Cut-off의 법칙을 이해하라
    • 11.2.0.1 까지는 서브쿼리 개수가 3과 7일때 고려하는 Iteration 개수가 Down-Grade 된다.
    • 버전에 따라 달라질 수 있으므로 4.2장에 소개된 SQL을 새로운 버전에서 서브쿼리 숫자를 바꿔가며 테스트 해야한다.
  • 하위 Loop 를 경계하라
    • 만일 서브쿼리가 6개, 각각 서브쿼리가 Unnesting 되어 CVM이나 JPPD가 모두 실행될 수 있는 상황이라면 ?
    • Hard Parsing에 걸리는 시간이 Table이나 Index scan에 걸리는 시간보다 더 클 수 있다.
    • 아래 psedo code는 Interleaving의 로직을 단순화 시킨 것이다 ( 4.12장 )

IF CSU is Enable THEN
  FOR i in 1 .. 12 LOOP        --> CSU를 위한 LOOP
       CSU 적용;
       CSU Costing;

       IF CVM IS Enable THEN
          FOR j in 1 .. 12 LOOP  --> CVM을 위한 하위 LOOP
            CVM 적용 ;
            CVM Costing;
       END LOOP;
END IF;

IF JPPD is Enable THEN
   FOR k in 1..12 LOOP        --> JPPD를 위한 하위 LOOP
       JPPD 적용;
       JPPD Costing;
    END LOOP;

END IF;

END LOOP;

최저 Cost 적용;
END IF;


    • CSU를 고려하기 위해 바깥쪽 LOOP가 12번 실행될 때마다 새로운 SQL을 CVM 모듈에 적용하고 있다.
    • CVM을 적용할 수 있는지 체크하고, 가능하다면 CVM LOOP (Iteration) 가 최대 12번 실행될 수 있다.
      (JPPD 경우도 마찬가지)
    • 이론적으로 가능한 Loop 횟수 : CSU 12회 X (CVM 12회 + JPPD 12회) = 288회
  • 하위 Loop가 부하가 되는 경우 서브쿼리를 인라인뷰로 대체하라
    • 288회 loop가 반복된다. 1단계 LOOP는 개수가 늘어나도 성능에 미치는 영향은 일정하게 증가.
    • 하위 LOOP 가 있을 경우 성능이 급격히 저하될 수 있다.
    • 자주 수행되는 SQL이 Complex 서브쿼리 개수가 많으며, 매번 Hard parsing 이 발생하는 Dynamic SQL이라면 서브쿼리를 없애고 인라인뷰로 대신하는 것이 가능한지 생각해야 한다.
  • LOOP 288회를 24회로 줄일 수 있어
    • shared pool 은 한정적이나 Hard Parsing 되어야 할 SQL은 넘쳐난다. -> SQL Aging Out 현상이 발생한다.
    • 그러므로 꼭 Dynamic SQL 이 아니더라도 이 방법을 적용해야 Hard Parsing 부하를 최소화 한다.
      (Loop 횟수가 단 24호로 줄어들 것이다.)
    • Interleaving 을 Juxtaposition 으로 바꾸어 적용하는 것으로 Hard Parsing 시 부하를 없앤다.