안녕하세요.
현재 업체별 집계내역(최근3년치의 각 법인별 합계 내역)을 구하는 쿼리를 만들고 있습니다.
아래 첨부파일이 그 쿼리인데, 이게 집계를 하다보니 속도가 너무나 느립니다.
기본적인 업체의 정보만 가지고 오면 속도가 빠른데 현재 첨부파일의 주석처리(--) 한 부분을 주석을 제외하고 돌리면
기본 2~30초를 넘나듭니다.
음..이걸 속도개선을 할수 있는 다른 방법이 없을지 문의드립니다.
튜닝이라던지, 아니면 함수를 좀더 다른 방법으로 만든다던지, 아니면 View를 만든다던지 등..
획기적인 방법이 없을지 문의드립니다....
단순 쿼리만 보고 분석이 쉽지는 않으시겠지만, 방안 조언 부탁드려봅니다.
1. Distinct 는 왜 사용했을까요?
- 잘못 사용한게 아닌지 검토 필요합니다.
2. Rollup 은 왜 사용했을까요?
- 불필요합니다.
3. 집계 하는 인라인뷰에서
- SSUGL G 에 대한 조인이 꼭 필요할까요?
- 필요 없을 듯 하구요.
- 굳이 조인해야 한다면? 밖의 조건절도 함께 주는게 좋습니다.
- G.JOB_STATUS ='P' AND G.SELLER_TYPE = 'CP' AND G.SELLER_COND = 'R'
4. GETAMT 함수가 문제라면?
- 밖에서 중복 사용되는 것을 인라인뷰 안에서 한번만 사용하는 것으로 바꿔보세요.
- 인라인뷰 안에서 스칼라 서브쿼리 형태로 사용하세요.
- (SELECT GETAMT(N.SELLER_MGT_CODE, N.GR_YEAR) FROM dual) AS amt
필드별 항목이 틀려 계속해서 getamt funtion을 호출하는 방식으로 사용을 하였습니다.
아래 getamt function을 한번만 쓴다는게 이해가 잘 되지 않네요.
주석부분에서 계속해서 호출하고 있는 getamt function에 문제가 있는것으로 보인다면 어떻게
아래 function을 활용하여 속도를 줄일수 있을까요?
GetAmt Function은 아래와 같습니다.
CREATE or REPLACE FUNCTION GETAMT(P_SELLER_MGT_CODE VARCHAR2,P_DATE VARCHAR2)
RETURN NUMBER IS RS NUMBER(10);
BEGIN
SELECT sum(T.PL0001) INTO RS
FROM DCC_PACKET07 T, DCC_PACKET10 R
WHERE
R.RESNO IN ( SELECT IRS_NO FROM SSUGL WHERE SELLER_MGT_CODE = P_SELLER_MGT_CODE )
AND R.TRBSDT1 = P_DATE;
RETURN RS;
END GETAMT;
getamt 사용한 것을 보면 동일 코드가 반복 사용되고 있습니다.
- GETAMT(G.SELLER_MGT_CODE,T7.GR_YEAR2) 이 부분만 24번 사용이 되고 있네요.
- 이부분을 T7 안쪽으로 넣으세요.
- (SELECT GETAMT(N.SELLER_MGT_CODE, N.GR_YEAR) amt2 ...) T7
- 이 때 dual 을 이용한 스칼라서브쿼리 형태로 하면 더 좋습니다.
- (SELECT (SELECT GETAMT(N.SELLER_MGT_CODE, N.GR_YEAR) FROM dual) amt2 ...) T7
펑션 내부에서 사용되는 쿼리 조건 항목에 인덱스가 존재하는지 확인하세요.