ABAP 튜닝을 위해 READ TABLE의 BINARY SEARCH를 사용하는 방법


ABAP 프로그램에서 가장 많이 사용하는 구분 중에 하나가 인터널 테이블을 처리하는 LOOP AT itab ~ ENDLOOP. 구문일 것입니다.

너무나 당연시하게 사용하다 보니 정작 실행 시간에 대해서는 신경을 쓰지 않는 경우가 많습니다.

특히 LOOP 안에서 또 다른 LOOP을 돌려서 처리하는 중첩 LOOP 구문이 있다면 인터널 테이블의 라인 건수에 따라 실행 시간은 무한정 늘어날 수 있기에 신경을 써줄 필요가 있습니다.

이번 글에서는 ABAP 튜닝을 위해 READ TABLE의 BINARY SEARCH를 사용하는 방법에 대해 알아보겠습니다.

실제 ABAP 프로그램 소스를 통해 READ TABLE의 BINARY SEARCH를 사용했을 때와 사용하지 않았을 때의 LOOP 구문을 비교해 보겠습니다.

ABAP 튜닝을 위해 READ TABLE의 BINARY SEARCH를 사용하는 방법

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을 해 보고 서로 비교해 보세요.
몇 십 분이 넘게 소요되는 프로그램이 단 몇 초 만에 끝나는 경험을 하실 수 있습니다.





이 글이 도움이 되었기를 바랍니다. ^-^


답글 남기기