쿼리 좀 봐주세요...튜닝이 필요할거 같은데 방법을 모르겠네요.. 0 4 2,208

by 김재훈 [SQL Query] [2013.05.30 15:32:18]



매출원장이 있는 테이블을 기간으로 조회한 다음 오더번호로
주문테이블에서 주문내역을 조회하려고 합니다.

매출원장테이블을 기준으로 주문내역을 맞춰보려고 하는데 쿼리 돌리니 시간이 많이 걸리네요..
쿼리만들때 부터 오래걸릴거라고는 생각했지만 다른 방법을 몰라서...ㅡㅡ;
시간을 단축시킬수 있는 방법이 있는지 문의 드립니다.

SELECT
    VBELN1,
    POSNR1,
    AUART,
    max(VBELN3) S_VBELN3,
    BSTNK,   
    FKDAT,
    NETWR1,
    FKLMG,
    SUBSTR(KUNAG,-6) S_KUNAG,
    (SELECT DISTINCT B.RE_VBELN FROM ODM_ORDER_MAT B WHERE B.RE_VBELN = VBELN3) S_VBELN,
    (SELECT DISTINCT A.TID FROM ODM_ORDER_MAT B LEFT JOIN ODM_ORDER A ON A.ORDER_NO = B.ORDER_NO WHERE B.RE_VBELN = VBELN3) S_TID
    (SELECT DISTINCT B.ORDER_NO FROM ODM_ORDER_MAT B WHERE B.RE_VBELN = VBELN3) S_ORDER_NO
FROM IRT_RELEASED
WHERE REPLACE(FKDAT,'-','') BETWEEN '20110301' AND '20110331'
AND AUART = 'RE'
GROUP BY VBELN1,POSNR1,FKDAT,NETWR1,FKLMG,KUNAG,AUART,BSTNK,VBELN3

감사합니다.
by 채용근 [2013.05.30 15:45:03]
1. Scalar 서브쿼리를 조인으로 빼세요

2. WHERE 절에 FKDAT BETWEEN '2011-03-01' AND '2011-03-31' 변경

by 마농 [2013.05.30 15:50:59]
전반적으로 잘못되어 있어서...
튜닝보다는 쿼리 정리부터 해야 할 듯 하네요.
1. 모든 항목을 Group By 하는게 맞는지 의문이구요?
2. 서브쿼리에 Distinct 를 왜 하는지 의문이네요.
3. 아우터 조인도 무의미해 보이구요.

by 김재훈 [2013.05.30 16:04:23]
네 답변감사드립니다.
1. 모든 항목을 Group By 하는게 맞는지 의문이구요?
-> irt_released 테이블에는 동일한 값이 여러개 있어서 Group By 시켰구요.
-> 해당 테이블은 일정시간만다 매출데이타가 insert되는거라 동일한 row 여러개 있습니다.
2. 서브쿼리에 Distinct 를 왜 하는지 의문이네요.
-> Distinct 없이 하니 ORA-01427:single-row subquery returns more than one row 에러나서 추가했습니다.
3. 아우터 조인도 무의미해 보이구요.
-> 서브쿼리시에 테이블두개를 조인해야되는 상황이어서..odm_order 와 odm_order_mat 조인을 했습니다.
irt_released 에서 오더번호를 구하고
이 오더번호는 odm_order_mat에 있고 tid는 odm_order에 있어서 그렇게 했습니다.
irt_released 와 odm_order_mat 키값은 오더번호(sap)
odm_order_mat와 odm_order 키값은 주문번호

by 마농 [2013.05.30 16:11:07]

중복의 원인을 제거해야 합니다.
중복의 원인을 제거하지 않고 중복된 결과만을 Group By, Distinct 해서는 안됩니다.
각테이블의 컬럼 명세와 인덱스 정보등을 알려주세요.
샘플데이터를 보여주시면 더욱 좋습니다.

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