매출데이터를 가지고 와서 작업을 해야 하는데요.
부득이하게 참조해야 할 테이블이 7-8개 정도가 됩니다.
그것도 하필이면 데이터가 많은 vbak, vbap테이블을 같이 참조하구요.
우선 제 사수가 예전에 해놓았던 조인은 아래와 같습니다.
SELECT a~auart b~matnr AS prd_cd e~maktx AS prd_name
SUM( c~rfmng ) AS rfmng
INTO CORRESPONDING FIELDS OF ztab1
FROM ( ( ( ( ( vbak AS a INNER JOIN vbap AS b
ON a~mandt = b~mandt AND
a~vbeln = b~vbeln ) INNER JOIN vbfa AS c
ON b~mandt = c~mandt AND
b~vbeln = c~vbelv AND
b~posnr = c~posnv ) INNER JOIN vbuk AS d
ON c~mandt = d~mandt AND
c~vbeln = d~vbeln ) INNER JOIN makt AS e
ON b~mandt = e~mandt AND
b~matnr = e~matnr ) INNER JOIN mara AS f
ON b~mandt = f~mandt AND
b~matnr = f~matnr ) INNER JOIN vbkd AS p
ON a~vbeln = p~vbeln AND
p~posnr = '000000'
WHERE a~auart IN ('KB','TA','KE','KR','KA','RE') AND
b~pstyv NOT IN ('TAFF', 'TANF') AND"""""""
a~vkorg = '1000' AND
a~vtweg = '10' AND
( ( a~audat >= w_date1 AND
a~audat <= w_date2 ) OR
( p~bstdk_e >= w_date1 AND
p~bstdk_e <= w_date2 ) ) AND
a~augru NOT IN ('15', '16', '17', '18', '19') AND
a~augru NOT IN ('20', '21', '22', '23', '30') AND
d~wbstk = 'C' AND
e~spras = sy-langu AND
c~vbtyp_n IN ('J','T') AND
c~stufe = '00' AND
f~blanz <> '001' AND
a~kunnr = orgcode AND
b~kzwi1 <> 0 AND
p~bstkd <> '홈파티 특별공급가'
GROUP BY a~auart b~matnr e~maktx.
보시는 것과 같이 vbak, vbap, vbfa, vbuk, makt, mara, vbkd 테이블을 한번에 조인을 걸어서 놔두셨더라구요.
필요에 의해 수정을 하면서 보았는데 속도가 꽤나 드리더군요...
이걸 조인은 두세개만 하고, 나머지는 테이블을 미리 읽어두고 read해서 처리하는게 더 빠를지, 아니면 조인을 그대로 유지하는게 더 빠를지,,
테스트를 해보기 전에 무의미한 것이라면 굳이 할필요가 없을것 같아 이렇게 조언을 구해봅니다.
조인이 나을까요... 테이블별로 데이터 select 해놓고 read하는게 더 빠를까요?
댓글 4
-
Giant
2008.10.18 03:48
-
erdfg
2008.10.20 19:24
경우에 따라 다르긴 한데... SDBE 에서 플랜실행해보시면 인덱스등을 적절히 타는지 확인하실수 있을겁니다.
쿼리작성은 NATIVE SQL 처럼 작성하시면 되구요.
만약 수정하신다면 VBFA테이블은 조인거시지 마세요. 업그레이드 되면서 클러스터 테이블로 바뀌는걸로..알고 있습니다..
-
나무나라
2008.10.20 20:59
제가 보기에는 테이블을 미리 읽어두고 Read 처리하는것은 좋지 않은것 같습니다..
어차피 SAP에서 DB로 연결하는 행위가 작을 수록 좋으니 현재 처럼 JOIN을 거는것이 좋긴 한데...
이럴경우는 전체 PLAN을 실행 시켜 인덱스를 탈수 있도록 SQL문을 수정 하는것이 좋습니다...
그리고 JON이 이 정도로 많으면 그냥 NATIVE SQL문이 보기에 편할 수 있습니다.
-
김구민
2008.10.21 18:42
세분 답변 감사합니다~ Plan을 통해 인덱스 타는걸 처음 알았어요~ 덕분에 튜닝 무사히 마쳤습니다~ 고맙습니다~
조인은 테이블이 2개 이상에는 효율이 낮습니다.
저는 join문,그리고 read문과 for all entries in문을 같이 사용하였습니다.
참고로 테스트 해보시기 바랍니다.