ABAP 프로그램에서 가장 많이 사용하는 구분 중에 하나가 인터널 테이블을 처리하는 LOOP AT itab ~ ENDLOOP. 구문일 것입니다.
너무나 당연시하게 사용하다 보니 정작 실행 시간에 대해서는 신경을 쓰지 않는 경우가 많습니다.
특히 LOOP 안에서 또 다른 LOOP을 돌려서 처리하는 중첩 LOOP 구문이 있다면 인터널 테이블의 라인 건수에 따라 실행 시간은 무한정 늘어날 수 있기에 신경을 써줄 필요가 있습니다.
이번 글에서는 ABAP 튜닝을 위해 READ TABLE의 BINARY SEARCH를 사용하는 방법에 대해 알아보겠습니다.
실제 ABAP 프로그램 소스를 통해 READ TABLE의 BINARY SEARCH를 사용했을 때와 사용하지 않았을 때의 LOOP 구문을 비교해 보겠습니다.
READ TABLE의 BINARY SEARCH를 사용하지 않았을 때 – 튜닝 전(일반적인 사용 예)
▼ 예제1 : it_tab의 모든 자재내역을 itab에서 자재번호로 찾아서 넣어주기 위한 로직입니다.
LOOP AT itab.
LOOP AT it_tab WHERE matnr = itab-matnr.
it_tab-maktx = itab-maktx.
MODIFY it_tab.
ENDLOOP.
ENDLOOP.
▼ 예제2 : it_tab에서 itab의 자재번호가 있으면 모두 삭제하는 로직입니다.
LOOP AT itab.
DELETE it_tab WHERE itab-matnr.
ENDLOOP.
위의 두 가지 로직은 모두 Internal Table을 Sequential Search를 하고 있습니다.
인터널테이블 Row 수가 많아질수록 실행 속도는 점점 더 느려지게 됩니다.
itab, it_tab의 레코드 수가 각각 10,000건이라고 하면 LOOP 실행은 무조건 100,000,000번 실행하게 됩니다.
READ TABLE의 BINARY SEARCH를 사용했을 때 – 튜닝 후
▶ 앞 단락과 동일한 자재내역을 찾아서 넣어주는 작업을 처리하는 로직을 READ TABLE을 추가해서 튜닝 한 후의 로직입니다.
READ TABLE 구문이 추가되면서 앞에서 단순하게 중첩 LOOP를 사용했을 때 보다 다소 복잡해 보일 수 있습니다.
SORT it_tab BY matnr.
LOOP AT itab.
READ TABLE it_tab WITH KEY matnr = itab-matnr BINARY SEARCH.
IF SY-SUBRC = 0.
LOOP AT it_tab FROM SY-TABIX.
IF it_tab-matnr <> itab-matnr. ” 더 이상 찾을 필요가 없으므로 it_tab 루프 종료
EXIT.
ENDIF.
it_tab-maktx = itab-maktx.
MODIFY it_tab.
* DELETE it_tab.
ENDLOOP.
ENDIF.
ENDLOOP.
<참고 하세요>
Binary Search는 Internal Table의 키 값의 중간을 짤라 가면서 비교하며 찾아가는 방식 입니다.
그렇기 때문에 Binary Search를 사용하기 위해서는 Sort를 먼저 해줘야 합니다.
ABAP 프로그램을 보면 의외로 Binary Search를 사용하지 않고 단순 LOOP로 처리한 경우를 많이 보게 됩니다.
수 만건 이상의 인터널 테이블을 처리한다면 Binary Search를 적용해서 Tuning을 해 보고 서로 비교해 보세요.
몇 십 분이 넘게 소요되는 프로그램이 단 몇 초 만에 끝나는 경험을 하실 수 있습니다.
※ 함께 읽으면 도움이 될 만한 다른 포스팅 글입니다.
- ABAP에서 인덱스(Index)를 사용하여 실행 시간을 단축 시키는 방법 – 튜닝(Tuning) 가이드
- ABAP Dictionary의 테이블유지보수생성기로 테이블 유지보수 다이얼로그를 생성하고 활용하는 방법
- ABAP에서 LIKE문의 독특한 사용 예제(Open Query에서 LIKE문 사용하기)
- SAP ABAP에서 인덱스(Index)의 정의 및 쿼리문에서 인덱스가 적용되지 않는 원인
- ABAP Dictionary에서 테이블 인덱스(Index)를 생성하고 활성화 하는 방법
- ABAP 리스트의 출력 포맷을 변경하여 인쇄 페이지 사이즈를 조정하는 방법
이 글이 도움이 되었기를 바랍니다. ^-^