transformation 으로 해서 db table 을 계속 접근하는 것보다 end routine으로 internal table에 담은 후 처리하는게 효율적일 것 같아서 로직을 수정해보았는데 속도가 너무 안나오네요.. 거의 사용이 불가능 할 정도... 기간을 1년치로 하면 transformation 으로 하는게 더 빠른 것 같아요.. 혹시 방법이 있을까요?
아래 로직입니다.
DATA : L_SRC TYPE STANDARD TABLE OF ZTEIS_03,
W_L_SRC LIKE LINE OF L_SRC,
WA LIKE LINE OF RESULT_PACKAGE.
DATA : L_ZTEIS_03 TYPE STANDARD TABLE OF ZTEIS_03,
W_ZTEIS_03 LIKE LINE OF L_ZTEIS_03.
SELECT * INTO CORRESPONDING FIELDS OF TABLE L_SRC
FROM ZTEIS_03.
SORT L_SRC DESCENDING BY ZCALDAY ZEISC001 ZEISC002 ZEISD001 ZEISD002.
LOOP AT RESULT_PACKAGE INTO WA.
APPEND LINES OF L_SRC TO L_ZTEIS_03.
IF WA-/BIC/ZEISC001 EQ 'RM_A_08' OR WA-/BIC/ZEISC001 EQ 'CH_A_08' .
DELETE L_ZTEIS_03 WHERE NOT ( ZEISC001 EQ WA-/BIC/ZEISC001 AND
ZEISD001 EQ WA-/BIC/ZEISD001 AND
ZEISD002 EQ WA-/BIC/ZEISD002 ).
DELETE L_ZTEIS_03 WHERE ZCALDAY >= WA-CALDAY.
ELSE.
DELETE L_ZTEIS_03 WHERE NOT ( ZEISC001 EQ WA-/BIC/ZEISC001 AND
ZEISD001 EQ WA-/BIC/ZEISD001 AND
ZEISD002 EQ WA-/BIC/ZEISD002 ).
DELETE L_ZTEIS_03 WHERE ZCALDAY >= WA-CALDAY.
DELETE L_ZTEIS_03 WHERE ZEV_04 = '0'.
ENDIF.
* MAX 값 찾기
SORT L_ZTEIS_03 DESCENDING BY ZCALDAY ZEISC001 ZEISC002 ZEISD001
ZEISD002.
READ TABLE L_ZTEIS_03 INDEX 1 INTO W_ZTEIS_03.
WA-/BIC/ZEV_05 = W_ZTEIS_03-ZEV_04.
MODIFY RESULT_PACKAGE FROM WA.
CLEAR L_ZTEIS_03.
CLEAR W_ZTEIS_03.
ENDLOOP.
댓글 2
-
십년만에
2013.10.25 07:33
-
Concatenate
2014.10.23 06:05
1년만에 댓글을 다네요^^ 개발자로써 정보가 될 까 해서 댓글 남겨둡니다.
1. 먼저 loop 문 안에서 sort 를 하고 있습니다.
개발자로써 지양해야 할 부분으로 sort 는 항상 loop 밖에서 진행해야만 합니다.
이 부분부터 밖으로 빼셔야 합니다.
2. APPEND LINES OF L_SRC TO L_ZTEIS_03. 이 구문 자체가 결국l_zteis_03[] = l_src[]
이란 소리인데. 이 구문 자체를 loop 를 돌면서 계속 엎어치고 있다는 생각이 듭니다.
외부에서 한번만 담아도 될 것입니다.
3. delete 시에 건건히 조건으로 삭제하는 것은 퍼포먼스에 영향을 주므로
flag 를 줘서 한번에 날리는 것이 낫습니다. 혹은 key 값을 날려서 나중에 한번에 키값없는 것을 지워주는 편이 빠릅니다.
4. modify 또한 loop 문 밖에서 해주는 것이 맞습니다.
이러한 부분들만 전부 로직적으로 수정한다면 매우매우 큰 퍼포먼스가 나올 것입니다.
1시간 걸리던것도 2~3초면 해결 될 수도 있습니다.
(이런 경험을 해본적이 있기 때문이지요.)
특히나 loop 안에서 sort 문은 어마어마하게 느려집니다...
1년전 문의 내용이지만 혹여나 도움이 될까 댓글 달았습니다..^^
10/23 일자 Daily OnePaper 에 ' Loop 내의 Delete 구문 ' 이 나왔는데 도움이 되지 않을까요?
URL : http://www.e-abap.net/?document_srl=390701
LOOP AT RESULT_PACKAGE INTO WA.
APPEND LINES OF L_SRC TO L_ZTEIS_03.
L_SRC internal Table 을 L_ZTEIS_03 Internal Table 에 넣고, 조건에 따라서 데이터 지우는 로직이 있는데
조건에 따라 지운 결과는 다른 Internal Table 에 저장하면서 Loop 실행하는 건 어떻까요?
그리고, Modify Result Package 하는 부분도 Loop 밖으로 빼서 L_ZTEIS_03 을 LOOP 돌리면서 처리하면 어떨지..