function 속도저하 0 2 1,021

by 초보개발자민짱 [PL/SQL] [2016.09.20 10:53:21]


RETURN VARCHAR2 IS  
    V_RETURN_VALUE VARCHAR2(100) := '';  
BEGIN  
  
        SELECT CASE WHEN IN_GBCD = '1' THEN --등록여부한글
                    CASE WHEN MAX(DEUNGROKINJEONG) = '1' THEN '인정'
                         WHEN NVL(D.DEUNGROKGEUM_GYE,0) <=  NVL(SUM(N.NAPBU_DEUNGROKGEUM_GYE),0) - NVL(H.HWANBUL_AMT,0) THEN '등록'
                         WHEN NVL(H.HWANBUL_AMT,0) > 0 AND NVL(D.DEUNGROKGEUM_GYE,0) >  NVL(SUM(N.NAPBU_DEUNGROKGEUM_GYE),0) - NVL(H.HWANBUL_AMT,0) THEN '환불'
                         WHEN NVL(D.DEUNGROKGEUM_GYE,0) >  NVL(SUM(N.NAPBU_DEUNGROKGEUM_GYE),0) - NVL(H.HWANBUL_AMT,0) THEN '미등록' END 
                    
                    --납부등록금
                    WHEN IN_GBCD = '2' THEN TRIM(TO_CHAR(NVL(SUM(N.NAPBU_DEUNGROKGEUM_GYE),0) - NVL(H.HWANBUL_AMT,0) ))
                    --납부구분코드(Y/N)     
                    WHEN IN_GBCD = '3' THEN
                    CASE WHEN MAX(DEUNGROKINJEONG) = '1' THEN 'Y'
                         WHEN NVL(D.DEUNGROKGEUM_GYE,0) <=  NVL(SUM(N.NAPBU_DEUNGROKGEUM_GYE),0) - NVL(H.HWANBUL_AMT,0) THEN 'Y'
                         WHEN NVL(H.HWANBUL_AMT,0) > 0 AND NVL(D.DEUNGROKGEUM_GYE,0) >  NVL(SUM(N.NAPBU_DEUNGROKGEUM_GYE),0) - NVL(H.HWANBUL_AMT,0) THEN 'N'
                         WHEN NVL(D.DEUNGROKGEUM_GYE,0) >  NVL(SUM(N.NAPBU_DEUNGROKGEUM_GYE),0) - NVL(H.HWANBUL_AMT,0) THEN 'N' END
                    --납부일자 
                    WHEN IN_GBCD = '4' THEN MAX(N.DEUNGROKGEUM_NAPBU_DT)
                    --납부구분코드(Y/N)     
                    WHEN IN_GBCD = '5' THEN
                        CASE WHEN MAX(DEUNGROKINJEONG) = '1' THEN 'Y'
                             WHEN NVL(SUM(N.NAPBU_DEUNGROKGEUM_GYE),0) - NVL(H.HWANBUL_AMT,0) > 0 THEN 'Y'
                        ELSE 'N' END
               END  AS RESULT
               
          INTO  V_RETURN_VALUE
          
          FROM  (SELECT   D.YEAR
                        , D.HAKGI
                        , D.HAKBEON
                        , D.DAESANG_GBCD
                        , NVL(MAX(D.DEUNGROKINJEONG_YN),'0') AS DEUNGROKINJEONG
                        , SUM(D.DEUNGROKGEUM_GYE) AS DEUNGROKGEUM_GYE
                   FROM HR_DEUNGROK_DAESANGJA_M D
                  WHERE YEAR           = IN_YEAR 
                        AND HAKGI      = IN_HAKGI  
                        AND HAKBEON    = IN_HAKBEON  
                        AND DAESANG_GBCD NOT IN  ('10')
                  GROUP BY D.YEAR
                         , D.HAKGI
                         , D.HAKBEON
                         , D.DAESANG_GBCD ) D
                LEFT OUTER JOIN  HR_NAPBU_MST_M N
                    ON D.YEAR           = N.YEAR 
                    AND D.HAKGI         = N.HAKGI
                    AND D.HAKBEON       = N.HAKBEON
                    AND D.DAESANG_GBCD = N.DAESANG_GBCD
                LEFT OUTER JOIN
                    ( SELECT   H.YEAR
                             , H.HAKGI
                             , H.HAKBEON
                             , H.DAESANG_GBCD
                             , SUM(H.HWANBUL_GYE) AS HWANBUL_AMT
                        FROM HR_HWANBUL_M H
                       WHERE YEAR       = IN_YEAR 
                         AND HAKGI      = IN_HAKGI  
                         AND HAKBEON    = IN_HAKBEON 
                       GROUP BY H.YEAR
                             , H.HAKGI
                             , H.HAKBEON
                             , H.DAESANG_GBCD) H
                    ON  N.YEAR          = H.YEAR
                    AND N.HAKGI         = H.HAKGI
                    AND N.HAKBEON       = H.HAKBEON
                    AND N.DAESANG_GBCD = H.DAESANG_GBCD
         WHERE D.YEAR    = IN_YEAR  
           AND D.HAKGI   = IN_HAKGI  
           AND D.HAKBEON = IN_HAKBEON
      GROUP BY  D.YEAR
              , D.HAKGI
              , D.HAKBEON
              , DEUNGROKGEUM_GYE
              , H.HWANBUL_AMT   
           ;  
      
    RETURN V_RETURN_VALUE;  
     
EXCEPTION  
    WHEN NO_DATA_FOUND THEN 
        DBMS_OUTPUT.PUT_LINE('데이터없음'); 
        RETURN ''; 
    WHEN OTHERS THEN   
        DBMS_OUTPUT.PUT_LINE('OTHERS'); 
        RETURN ''; 
        
END;
/

 

IN값을 던져서 리턴값을 확인하는 FUNCTION 인대요 속도저하가 너무 큽니다만.

데이터가 2400건밖에안돼는데 12초나 걸리네요 . PK값싹다 맞춰서 3~4초 빨라지긴 했는데 너무 느립니다 .

혹시 퀴리에 문제가 있는걸까요 ? 질무좀드립니다

 

by 마농 [2016.09.20 11:38:17]

각 테이블의 PK 가 어찌 되나요? 건수는?
year, hakgi, hakbeon 의 인덱스가 있나요?
year, hakgi, hakbeon 의 자료형이 뭔가요?
in_year, in_hakgi, in_hakbeon 의 자료형을 일치시켰나요?
뭐가 2400 건인가요? 함수 수행횟수?
d 와 h 를 우선 Group By 했듯이 n 도 우선 Group By 하면 좋을 듯 하네요.
daesang_gbcd 의 역할은 뭔가요? 큰 역할이 없으면 빼도 좋을 듯.
 


by 초보개발자민짱 [2016.09.20 12:08:05]

N테이블도 GROUP BY 처리하니 속도가 향상 되었습니다 .

답변감사합니다 ~ ^^

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입