집계 쿼리 튜닝이 가능할까요? 0 6 974

by 비연 [SQL Query] [2016.12.07 18:22:29]


QUERY.xml (20,133Bytes)

안녕하세요.

현재 업체별 집계내역(최근3년치의 각 법인별 합계 내역)을 구하는 쿼리를 만들고 있습니다.

아래 첨부파일이 그 쿼리인데, 이게 집계를 하다보니 속도가 너무나 느립니다.

기본적인 업체의 정보만 가지고 오면 속도가 빠른데 현재 첨부파일의 주석처리(--) 한 부분을 주석을 제외하고 돌리면

기본 2~30초를 넘나듭니다.

 

음..이걸 속도개선을 할수 있는 다른 방법이 없을지 문의드립니다.

튜닝이라던지, 아니면 함수를 좀더 다른 방법으로 만든다던지, 아니면 View를 만든다던지 등..

획기적인 방법이 없을지 문의드립니다....

 

단순 쿼리만 보고 분석이 쉽지는 않으시겠지만, 방안 조언 부탁드려봅니다.

by 우리집아찌 [2016.12.07 22:10:44]

GETAMT 펑셔내용을 좀 봐야할것같네요. 이넘이 돌면서 집계 해올것 같아요.

펑션 없애고 인라인뷰로 만들어 조인 할수 있으면 개선될것같아요.

 


by 마농 [2016.12.08 08:45:38]

Distinct 를 사용하셨네요.

Distinct 를 사용하는 경우 중 꼭 필요해서 사용하는 경우는 특수한 경우로 아주 드믄 경우이고

대부분의 경우 조인을 잘못하여 발생되는 중복자료를 억지로 제거하기 위해 사용하더군요.

조인에 문제가 있을 듯?


by 마농 [2016.12.08 10:36:27]

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


by 비연 [2016.12.08 15:25:06]

필드별 항목이 틀려 계속해서 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;


by 마농 [2016.12.08 16:35:24]

펑션 안의 쿼리를 보면 테이블은 두개인데 조인 조건이 없네요???


by 마농 [2016.12.08 15:41:34]

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


펑션 내부에서 사용되는 쿼리 조건 항목에 인덱스가 존재하는지 확인하세요.

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