[답변] Decode함수의 실행횟수 줄이기 0 2 5,223

by 마농 DECODE [2008.05.29 10:51:48]


-- 변경전 쿼리의 decode함수는 조인된 총 자료건수만큼 수행됩니다.
-- 변경후 쿼리는 3년 * 4분기 = 총 12번만 수행됩니다.
SELECT NVL(MIN(DECODE(yyyy_q,(:ls_year - 2)||’-1’,sq)),0) before_sq1
     , NVL(MIN(DECODE(yyyy_q,(:ls_year - 2)||’-2’,sq)),0) before_sq2
     , NVL(MIN(DECODE(yyyy_q,(:ls_year - 2)||’-3’,sq)),0) before_sq3
     , NVL(MIN(DECODE(yyyy_q,(:ls_year - 2)||’-4’,sq)),0) before_sq4
     , NVL(MIN(DECODE(yyyy_q,(:ls_year - 1)||’-1’,sq)),0) last_sq1
     , NVL(MIN(DECODE(yyyy_q,(:ls_year - 1)||’-2’,sq)),0) last_sq2
     , NVL(MIN(DECODE(yyyy_q,(:ls_year - 1)||’-3’,sq)),0) last_sq3
     , NVL(MIN(DECODE(yyyy_q,(:ls_year - 1)||’-4’,sq)),0) last_sq4
     , NVL(MIN(DECODE(yyyy_q,(:ls_year    )||’-1’,sq)),0) cur_sq1
     , NVL(MIN(DECODE(yyyy_q,(:ls_year    )||’-2’,sq)),0) cur_sq2
     , NVL(MIN(DECODE(yyyy_q,(:ls_year    )||’-3’,sq)),0) cur_sq3
     , NVL(MIN(DECODE(yyyy_q,(:ls_year    )||’-4’,sq)),0) cur_sq4
  FROM (SELECT TO_CHAR(TO_DATE(a.issue_mm,’yyyymm’),’yyyy-Q’) yyyy_q
             , ROUND(SUM(b.amt)/1000) sq
          FROM rt_wongm01 a
             , rt_wongd01 b
         WHERE a.agency_id  = b.agency_id
           AND a.issue_mm   = b.issue_mm
           AND a.car_no     = b.car_no
           AND a.car_dae_no = b.car_dae_no
           AND b.acc_cd LIKE ’423%’
           AND a.cust_cd    = 거래처
           AND a.issue_mm  <= :ls_year || ’12’
           AND a.issue_mm  >= (:ls_year - 2) || ’01’
         GROUP BY TO_CHAR(TO_DATE(a.issue_mm,’yyyymm’),’yyyy-Q’)
        )

by finecomp [2008.05.29 14:56:46]
마농님 안녕하세요...^^;

한가지 사족...
실제로 성능 테스트는 해봐야 겠지만...안쪽 Group By시 함수사용 없이 월별로만 Group By하고 나서 나머지 것들을 바깥에서 계산하는 것도 괜찮을 듯 하네요...;
그래봐야 3년 * 12달 = 36번 밖에 안되니...^^;

by 마농 [2008.05.29 17:55:21]
좋은 의견 감사해요~
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입