요즘 BC쪽에서 속도를 가지고 자꾸 얘기를 하네요..
약간 짱납니다..
다름이 아니라 자료를 조회하는 SELECT는 SQL에서 할때 약 5초 내외입니다.
자료는 BKPF와 BSIS를 조인해서 조회하는것입니다.
그런데 문제는 프로그램에서 할때는 약 5분 내외가 결리더군요..
여러가지 테스트를 해본결과 추측이긴 하지만 인터널 테이블에 입력하는 속도가 오래 걸리는거
같은데.. 이걸 해결할수 있는 방법 있을까요?
참고 소스좀 올려 봅니다.
SELECT A~BUKRS A~BUDAT A~BLART B~HKONT B~SHKZG SUM( B~DMBTR ) AS DMBTR
INTO CORRESPONDING FIELDS OF TABLE IT_ZFIT300
FROM BKPF AS A INNER JOIN BSIS AS B
ON A~BUKRS = B~BUKRS
AND A~GJAHR = B~GJAHR
AND A~BELNR = B~BELNR
AND A~BUDAT = B~BUDAT
WHERE A~BUDAT IN R_BUDAT
AND A~STBLG = SPACE
AND A~BSTAT IN ('','A','B','D','L','M','S',
'V','W','Z')
GROUP BY A~BUKRS A~BUDAT A~BLART B~HKONT B~SHKZG
HAVING SUM( B~DMBTR ) <> 0.
==> 실행시 약 5분내외 프로그램에서 실행
SELECT A.BUKRS, A.BUDAT, A.BLART, B.HKONT, B.SHKZG, SUM( B.DMBTR ) AS DMBTR
FROM BKPF AS A INNER JOIN BSIS AS B
ON A.BUKRS = B.BUKRS
AND A.GJAHR = B.GJAHR
AND A.BELNR = B.BELNR
AND A.BUDAT = B.BUDAT
WHERE A.BUDAT BETWEEN '20071001' AND '20071231'
AND A.STBLG = ''
AND A.BSTAT IN ('','A','B','D','L','M','S',
'V','W','Z')
GROUP BY A.BUKRS, A.BUDAT, A.BLART, B.HKONT, B.SHKZG
HAVING SUM( B.DMBTR ) <> 0
==> 5초 내외 (SQL실행)
댓글 7
-
디카초올~
2007.12.29 06:30
-
도련님
2008.01.02 20:24
인덱스는 확인해 봤는데 제대로 타더라고요..
ST05에서도 실행되는거 확인했고요..
이게 정상적으면 SQL이랑 SAP랑 실행 시간의 차이가 별로 안나야 하는건가요??
아님..원래 SAP가 늦은건지??
참. SAP 정말 모르겠습니다.
언제나 좀 이해가 갈런지...
-
avtiveman
2008.01.04 02:27
인덱스 부분이 제대로 탄다고 하면
혹시 SELECT A~BUKRS A~BUDAT A~BLART B~HKONT B~SHKZG SUM( B~DMBTR ) AS DMBTR
INTO CORRESPONDING FIELDS OF TABLE IT_ZFIT300
이부분에서 it_zfit300의 구조가 어떻게 됩니까?
만약 필드의 수가 넘 많게 구성되어 있는건 아닙니까?
bkpf 와 BSIS 전체의 필드로 구성되어 있다면 IT_ZFIT300의 필드수를 줄여보는것은 어떨까요..
-
도련님
2008.01.04 20:55
IT_ZFIT300는 위에 보이는게 다입니다. -
하루나
2008.01.07 20:09
구문적으로는 문제가 없어보이지만 위처럼돌리면 속도가 오래걸리지 않나요?
그리고 아래 테스트 문장은 INTO부분이 어디로 가는지 모르겠네요.
위처럼 대용량 데이터를 다뤄야할때 SQL구문이 오래걸릴시에는 최소한의 키값으로만 SELECT하고 Internal Table에서 Modify하는것도 방법입니다만. 데이터검증은 안해봤지만 다음과 같이 이용하면 어떨까 싶네요. BKPF와 BSEG를 이용하는 경우가 있어서 다음과 비슷한 방법을 이용햇는데 수행 속도에서 많은 단축을 했습니다.
비슷한게 아마 Reverse전표 빼고 금액 '0'인건을 제외하고 이런 로직을 넣으신거 같은데 Internal Table에 담아서 처리하는게 훨씬 빠른 경우가 있습니다. 눈으로볼때는 기간 늘려주면 수십만건도 가져오지만 해주는 작업이 없어서 훨씬 빠릅니다.
DATA : BEGIN OF IT_ZFITALL OCCURS 0,
BUKRS LIKE BKPF-BUKRS,
BUDAT LIKE BKPF-BUDAT,
BLART LIKE BKPF-BLART,
STBLG LIKE BKPF-STBLG,
BSTAT LIKE BKPF-BSTAT,
HKONT LIKE BSIS-HKONT,
SHKZG LIKE BSIS-SHKZG,
DMBTR LIKE BSIS-DMBTR,
END OF IT_ZFITALL.
DATA : BEGIN OF IT_ZFIT300 OCCURS 0,
BUKRS LIKE BKPF-BUKRS,
BUDAT LIKE BKPF-BUDAT,
BLART LIKE BKPF-BLART,
HKONT LIKE BSIS-HKONT,
SHKZG LIKE BSIS-SHKZG,
DMBTR LIKE BSIS-DMBTR,
END OF IT_ZFIT300.
TABLES : BKPF , BSIS .
SELECT A~BUKRS A~BUDAT A~BLART A~STBLG A~BSTAT
B~HKONT B~SHKZG B~DMBTR
* SUM( B~DMBTR ) AS DMBTR
INTO CORRESPONDING FIELDS OF TABLE IT_ZFITALL
FROM BKPF AS A INNER JOIN BSIS AS B
ON A~BUKRS = B~BUKRS
AND A~GJAHR = B~GJAHR
AND A~BELNR = B~BELNR
AND A~BUDAT = B~BUDAT
WHERE A~BUDAT BETWEEN '20070101' AND '20071230' .
* AND A~STBLG = SPACE
* AND A~BSTAT IN ('','A','B','D','L','M','S',
* 'V','W','Z') .
* GROUP BY A~BUKRS A~BUDAT A~BLART B~HKONT B~SHKZG .
* HAVING SUM( B~DMBTR ) <> 0.
DELETE IT_ZFITALL WHERE STBLG NE SPACE
*OR BSTAT IN ('','A','B','D','L','M','S','V','W','Z')
*==> Document Status사용되지 않는 부분 삭제
OR DMBTR = 0 .
SORT IT_ZFITALL .
LOOP AT IT_ZFITALL .
CLEAR : IT_ZFIT300 .
MOVE-CORRESPONDING IT_ZFITALL TO IT_ZFIT300 .
COLLECT IT_ZFIT300 .
ENDLOOP .
-
도련님
2008.01.08 02:24
한번 처리해 보고 다시 글 올리겠습니다.
참고로 문서유형은 나름 인덱스를 걸어주는데 사용하기 위하여 추가한것입니다.
-
도련님
2008.01.08 02:42
테스트 완료...
속도는 차이가 없습니다.
성의 있는 답변 감사드립니다.
현재는 저장프로시져로 돌리고 있습니다.
뭐 속도는 위에서 말한대로 잘나오고요..
해당 프로그램 실행시 ST05 성능추적을 사용하시어 실제 Execution Plan 이 어케 풀리는지 확인하셔야 할 것 같아요.
관련된 BKPF 인덱스도 확인하시고요.
위의 경우 BKPF 의 BUDAT 를 첫번째 필드로 하는 인덱스를 타는 것이 제일 나을 듯 합니다.
때에 따라서는 Hint 도 사용하셔야 할 듯합니다.