안녕하세요.
SAP 왕 초보 입니다...ㅠㅠ
아래 구문에서 ITAB의 인터널테이블 데이터가 많아 속도가 많이 느려집니다.
그래서 FOR ALL ENTRIES IN 구문 말고 다른 구문을 써야될 것 같은데요..
CHECK itab[] IS NOT INITIAL.
REFRESH gt_lips. CLEAR gt_lips.
SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_lips
FROM lips
FOR ALL ENTRIES IN itab
WHERE vgbel = itab-vbeln
AND vgpos = itab-posnr.
어떤식으로 쓰면 될까요?
1) GT_LIPS를 WHERE 조건만 사용해서 DATA를 담고,
2) LOOP AT를 사용하여 값을 추출해야되는 걸까요??
고수님들의 의견 부탁 드립니다 ㅠㅠ
댓글 3
-
Hwable
2021.08.25 20:37
추천:1 댓글
-
죠죠
2021.08.26 18:31
안녕하세요!
답변 감사드립니다^^
제 서버는 ECC 6.0 사용하고 있습니다.
사용자가 DATA를 가져올때, 조회조건을 1년 이상 가져와서 FOR ALL ENTRIES IN 구문안에 DATA가 상당히 많아 오랜시간 걸리더라구요..
그래서 FOR ALL ENTRIES IN 대신 JOIN 사용하여 처리 하였는데, 잘한건지.. 우선은 문제 없어 보이긴 하네요..ㅠㅠ
SELECT A~VBELN A~POSNR A~VGBEL A~VGPOS A~LFIMG A~PSTYV
INTO CORRESPONDING FIELDS OF TABLE GT_LIPS
FROM LIPS AS A INNER JOIN VBAP AS B ON A~VGBEL = B~VBELN
AND A~VGPOS = B~POSNR.하나 더 궁금한게 있는데... 아래 LOOP 문에 SELECT SINGLE 사용하고, 그 안에 SELECT MAX 문을 사용하여 속도가 상당히 느립니다..
LOOP AT MTAB.
SELECT SINGLE DEL_COMPLETE_FLG INTO MTAB-DELCF FROM Z00SCT001
WHERE PO_NO = MTAB-BSTNK
AND PO_DTL_SEQ = MTAB-POSEX_E
AND IF_VERSION = ( SELECT MAX( IF_VERSION ) FROM Z00SCT001
WHERE PO_NO = MTAB-BSTNK
AND PO_DTL_SEQ = MTAB-POSEX_E ).
MODIFY MTAB.
CLEAR MTAB.
ENDLOOP.위에 구문은 어떤식으로 변경하면 속도가 빠를 수 있을까요...
-
애불래
2021.08.27 11:19
인터널테이블 mtab를 for all entries로 해서 PO_NO, PO_DTL_SEQ, IF_VERSION, DEL_COMPLETE_FLAG 필드를 인터널테이블로 가져온뒤 SORT를 PO_NO, PO_DTL_SEQ, IF_VERSION 순서대로 하는데 IF_VERSION만 Descending으로 정렬한 뒤 delete adjacent COMPARING FIELDS PO_NO, PO_DTL_SEQ로 지우세요. 그럼 같은 값 기준 제일 위에 Descending으로 정렬된 IF_VERSION MAX값만 남고 중복되는 값들은 지워집니다.
이후 LOOP 안에서 READ TABLE BINARY SEARCH로 읽으면 되죠.
더 smart한 방법은 중복 지우지 말고 그냥 for all entries로 가져온 다음 loop at mtat안에서 loop where 조건으로 가져온 마지막 가장 큰 if_Version 값을 읽게 하는 방법도 있는데(인터널테이블은 PO_NO, PO_DTL_SEQ, IF_VERSION으로 정렬) 이런 경우 inner loop where조건에 맞는 인터널테이블 secondary index key를 정의해야 순차 검색이 발생하지 않죠
기본사항)
1. itab 인터널 테이블에 대해 vbeln posnr 에 대해 중복제거를 해주세요.
2. itab 인터널 테이블에 대해 vbeln posnr 순서로 sort 처리 해주세요.
3. select * 가 아닌 필요한 필드만 명기해주세요.
검토사항)
4. bc 레벨에서 parameter rsdb/max_blocking_factor 값을 조정해주세요. (서버 재부팅 필요 및 모든 for all entries in 구문에 대한 성능 영향미침)
for all entries in 구문에서 한번에 가져오는 데이터 행 수가 늘어나 join 성능이 향상됩니다.
5. 서버가 S4HANA버전이고 ABAP 버전이 7.52 이상이면 인터널테이블을 join 구문으로 활용해보세요.
ex) inner join @itab on vgbel = @itab-vbeln and vgpos = @itab-posnr