반응형

    Internal Table의 데이터를 읽는 방법으로 크게 두 가지가 있습니다. 특정 1줄을 읽는 READ와 전체를 순차적으로 1줄씩 읽는 LOOP입니다. 각각의 특징을 알아보겠습니다.

     

    1) READ

    Standard Table, Sorted Table은 key와 Index로 데이터에 접근이 가능하다고 했습니다. 꼭 Key 뿐 아니라 원하는 필드 조건도 제한 없이 사용 가능하다 보시면 되겠습니다.

     

    READ TABLE 테이블 WITH KEY 필드 조건

    READ TABLE 테이블 WITH TABLE KEY 필드 조건

    READ TABLE 테이블 INDEX 인덱스

     

    아래 구문은 조건으로 값을 읽을 때와 index로 읽을 때의 예를 나타냅니다. 읽힌 1줄의 데이터는 Header나 Work Area에 담기게 됩니다.

    WITH KEY는 조건으로 WITH TABLE KEY는 Internal table에 선언 시 명시한 Key필드들로 데이터를 읽을 때 사용합니다.

     

    READ TABLE 테이블 WITH KEY 필드조건 TRANSPORTING  ALL FIELDS.

    READ TABLE 테이블 WITH KEY 필드조건 TRANSPORTING NO FIELDS.

    READ TABLE 테이블 WITH KEY 필드조건 TRANSPORTING 필드1 필드2....

    TRANSPORTING은 읽은 데이터를 Work Area에 담을 때 전체 또는 선택한 필드 값만 가져올 수 있다.

    NO FIELDS 옵션은 Work Area에 값은 담지 않고 조건에 맞는 데이터가 있는지만 볼 때 주로 사용합니다.

     

    READ TABLE 테이블 WITH KEY 필드조건 COMPARING ALL FIELDS.

    READ TABLE 테이블 WITH KEY 필드조건 COMPARING 필드1 필드2....

    COMPARING은 데이터를 읽어 Work Area에 담는 것이 아닌 Structure나 Work Area에 담긴 값과 Internal table을 읽을 값이 같은지 비교를 해준다. 아래 예를 보면

    ls_stand3에 채워진 값과 Internal table lt_stand2를 matnr로 읽은 한 줄과 비교하여 달라는 구문이다.

    그 리턴 값은 아래와 같다. 상당히 유용한 구문입니다.

     

    SY-SUBRC = 0 : 동일하다.

    SY-SUBRC = 2 : 다르다.

    SY-SUBRC = 4 : 준 조건으로 가진 데이터가 Internal table에 없다.

     

    READ TABLE 테이블 WITH KEY 필드조건 BINARY SEARCH.

    데이터양이 많다면 필연적으로 순차적으로 원하는 데이터를 찾는 방법은 느릴 수밖에 없습니다.

    Standard Table을 사용하면서 속도를 높이는 방법으로 데이터를 정렬하여 Sorted Table처럼 사용하는 방법이 있습니다.

     

    그 방법으로 찾고자 하는 필드로 Sorting을 하고 BINARY SEARCH 옵션을 사용하는 방법입니다.

    이진 Search 알고리즘을 사용하여 빠르게 데이터를 찾아 줍니다. 되도록 버릇을 들여 사용하라고 할 만큼 속도 향상에 영향이 있습니다.

     

    그럼 첨부터 Sorted Table을 사용하면 되지 않겠는가 할 수도 있지만 Stand table은 Sorting을 어떻게 하는가에 따라 key를 바꾸는 효과를 발휘합니다. 프로그램 안에서의 융통성이 더 발휘되겠지요. 

    그렇다고 Sorting후 Binary Search를 한 경우가 첨부터 Sorted로 생성한 테이블보다 빠르지는 않습니다.

     

    2) LOOP

    특정 라인을 한 번에 찾는 것이 아닌 순차적으로 모든 데이터에 접근할 때 사용합니다. 프로그램 속도 저하의 원인이 되기도 합니다. 

     

    기본 사용 구문은 아래와 같습니다.

    LOOP 안에서 원하는 값을 읽으면 되겠습니다.

     

    3) Internal table의 상태 표시 시스템 변수들

    - SY-SUBRC : 구문 바로 위에서 실행한 작업이 오류 없이 이루어졌는지를 가지고 있음. 0 이면 성공 아니면 실패

    - SY-TABIX : Internal table의 현재 index를 가지고 있는다. (현재 행 번호)

          데이터 변경 후 몇 번째 index에 데이터를 update 할지 지정할 때 사용한다.

    - SY-INDEX : 순환문(DO, WHILE)에서 몇 번째 순환하고 있는지를 반환한다.

    - SY-TFILL : 변수 위에서 처리된 internal table의 총 라인수를 가지고 있음.

      DESCRIBE TABLE 구문으로 행수를 세는 것과 같음.

     

    4) READ, LOOP의 효과적인 활용

    4-1) READ문을 사용할 때는 Sorting과 BINARY SEARCH를 사용합니다.

        데이터 건수가 적다는 확신이 없으면 정렬 후 BINARY SEARCH를 사용하는 것이 좋습니다.

    4-2) LOOP의 WHERE절보다는 LOOP 안에 If 문을 사용하는 게 좋습니다.

          WHERE을 사용해도 시스템이 그것들을 찾기 위해 전체 검색을 하니 한 번의 Loop로 끝낼 수 있습니다.

    4-3) 특히 대용량 데이터에는 READ,  LOOP를 복합적으로 사용하자.

    찾고자 하는 필드로 Sorting을 하고 데이터를 BINARY SEARCH로 읽으면 빠르게 그 조건을 만족하는 데이터의 첫 줄을 알 수 있습니다. LOOP를 이 줄부터 시작하여 동일한 조건이 끝나는 부분에서 LOOP를 빠져나오면 상당한 속도의 이득이 있습니다. 

    Internal table의 데이터의 양이 많아질수록 프로그램 속도 저하가 많아집니다. 이는 OPEN SQL의 한계와

    Stored procedure 등을 사용하지 못하는 등 DB에 친화적이지 못한 SAP 환경이 많은 이유가 되었습니다.

    하지만 SAP HANA가 나오면서 위의 문제는 거의 해결되었다 봐도 될 정도로 변화가 많습니다.

     

    Internal table은 간단한 SELECT문으로 가져온 데이터를 가공하기 위한 기술적 성격이 강합니다. 가져올 때 DB단의 가공이 쉽지 않으니 Client단에서 가공을 해주는 것이죠. DB단의 부하를 줄이는 방법이겠지요. 새 기술로 그런 필요가 적어졌지만 기존 것이 있으니 그때까지는 써야겠죠.

     

    다음 포스팅은 데이터 변경에 대해 알아보겠습니다.

     

    긴 글 읽어주셔서 감사합니다.

     

     

     

    728x90
    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기