본문 바로가기

어쩌다 SAP/어쩌다 ABAP

8일차) 인터널 테이블 종류, 속도 비교, 명령어

3. 인터널 테이블 종류

- 인터널 테이블 종류는 개별 Entry에 접근하는 방법을 결정하며, 3가지 종류로 구분된다.

  • STANDARD TABLE      -    INDEX TABLE
  • SORTED TABLE          -    INDEX TABLE
  • HASHED TABLE
1. Standard Table

- 순차적 Index를 가지는 테이블이며 Tree 구조를 이루고 있다.

- READ, MODIFY, DELETE 구문으 사용할 때도 Index를 사용

- 키는 항상 Non-unique로 선언해야한다. 따라서 WITH UNIQUE 구문을 사용할 수 없다.

DATA: itab TYPE STANDARD TABLE OF <t_str>
     WITH NON-UNIQUE KEY <keys> [INITIAL SIZE <n>]  [WITH HEADER LINE].
<예제 5-5> - Standard 타입 인터널 테이블 선언하여 데이터 추가, 출력하는 프로그램

***1. STURCTURE Type 선언
*TYPES : BEGIN OF t_line,
*          field1 TYPE c LENGTH 5,
*          field2 TYPE c LENGTH 4,
*          field3 TYPE i,
*        END OF t_line.
*
***2. Standard Table 타입 선언
*TYPES t_tab TYPE STANDARD TABLE OF t_line WITH NON-UNIQUE DEFAULT KEY.
*
***3. Internal table 선언
*DATA gt_itab TYPE t_tab WITH HEADER LINE.
*
*gt_itab-field1 = 'Enjoy'.
*gt_itab-field2 = 'ABAP'.
*gt_itab-field3 = 1.
*APPEND gt_itab.
*
*READ TABLE gt_itab INDEX 1.
*
*WRITE : / gt_itab-field1, gt_itab-field2, gt_itab-field3.           "Enjoy ABAP 1"

- 인터널 테이블의 key를 선언할 때 개발자가 직접 정의하는 칼럼을 User Define Key라고 한다.

<인터널 테이블의 개별 Line에 접근하는 문장>

DATA gt_itab TYPE STANDARD TABLE OF t_line WITH KEY field1. 

 

2. Sorted Table

- Sorted Table은 Key 값으로 항상 정렬된 인터널 테이블 타입이다.

- 즉 개발자가 원하는 Key값으로 항상 정렬된 결고로 인터널 테이블에 저장하는 경우 사용한다.

- Index 또는 Key로 해당 Row를 찾아갈 수 있다.

- Standard Table은 WITH NON-UNIQUE만 사용가능하나 Sorted Table은 WITH UNIQUE도 사용할 수 있다.

- Sorted Table은 이미 정렬되어 있기 때문에 Sort 명령어를 사용하면 오류가 발생한다.

<예제 5-6> - Sorted Type의 인터널 테이블선언, 2개 entry 추가

***1. 스트럭쳐 타입 선언
*TYPES : BEGIN OF t_line,
*          col TYPE c,
*          seq TYPE i,
*        END OF t_line.
*
***2. Sorted 테이블 타입 선언
*TYPES t_tab TYPE SORTED TABLE OF t_line WITH UNIQUE KEY col.
*
***3. 인터널 테이블 선언
*DATA gt_itab TYPE t_tab WITH HEADER LINE.
*
*gt_itab-col = 'B'.
*gt_itab-seq = '1'.
*INSERT TABLE gt_itab.
*
*gt_itab-col = 'A'.
*gt_itab-seq = '2'.
*INSERT TABLE gt_itab.
*
*CLEAR gt_itab.
*READ TABLE gt_itab INDEX 2.
*
*WRITE : / gt_itab-col, gt_itab-seq.             "B 1"

- INSERT가 아니라 APPEND를 쓰면 오류가 난다고 한다.  

- Sorted Table은 자동으로 정렬해주는데 INSERT구문을 쓰면 알아서 값을 적절한 위치에 넣어주지만 APPEND구문을 쓰면 무조건 맨 밑에 값을 추가해주기 때문에 오류가 나는 "것 같다."ㅋㅋㅋ

 

3. Hashed Table

- 순차적인 Index를 갖고 있지 않고, Hash 값으로 계산된 Key 값으로만 탐색 가능하다.

- Hashed Table은 반드시 Unique하게 선언되어야 한다.

- Hashed Type의 인터널 테이블은 Index가 엇어서 READ TABLE ~ INDEX 구문을 사용할 수 없다.

- 대신 READ TABLE ~ WITH TABLE KEY 또는 WITH KEY 구문을 이용해서 인터널 테이블에 접근할 수 있다.

<예제 5-7>

***1. structure type 선언
*TYPES : BEGIN OF t_line,
*          col TYPE c,
*          seq TYPE i,
*        END OF t_line.
*
***2. hashed table 타입 선언
*TYPES t_tab TYPE HASHED TABLE OF t_line WITH UNIQUE KEY col.
*
***3. internal table 선언
*DATA gt_itab TYPE t_tab WITH HEADER LINE.
*
*gt_itab-col = 'B'.
*gt_itab-seq = '1'.
*INSERT TABLE gt_itab.
*
*gt_itab-col = 'A'.
*gt_itab-seq = '2'.
*INSERT TABLE gt_itab.
*
*CLEAR gt_itab.
*READ TABLE gt_itab WITH TABLE KEY col = 'A'.
*
*WRITE : / gt_itab-col, gt_itab-seq.                "A 2"

4. 인터널 테이블 속도 비교

1. Standard vs. Sorted Table

- Standard Table의 Key Access 속도는 인터널 테이블의 Line 수에 따라 선형 종속적으로 증가한다.

- Sorted Table의 Key Access 속도는 인터널 테이블의 Line 수에 따라 지수 함수로 증가한다.

- 즉 테이블의 건수가 증가할 수 록 Sorted Table의 탐색 속도가 월등히 빠르다.

  • APPEND 구문 : Standard table이 더 빠르다.
  • READ 구문 : Sorted Table이 더 빠르다.
2. BINARY SEARCH(Standard Internal Table)

- Standard Table은 반드시 SORT 구문으로 정렬한 후 BINARY SEARCH로 수행해야 한다.

(2, 1, 5, 6, 3, 7, 9, 4, 8, 10)의 데이터 중 '9'를 BINARY SEARCH가 어떻게 탐색하는가?

1. SORT 명령어로 (1, 2, 3, ~ , 10) 으로 정렬한다.
2. 중간값(5)와 '9'를 비교.
3. (6~10)의 중간값(8)과 '9'를 비교.
4. '9' 찾음.

=> 3번의 시도로 찾앗다. / Full Scan 하면 순서대로 8번 시도만에 찾게 될 것이다.
<예제 5-11> - BINARY SEARCH 하지 않는 경우

*TYPES: BEGIN OF line,
*         col1 TYPE i,
*         col2 TYPE i,
*         col3 TYPE i,
*       END OF line.
*
*DATA itab TYPE STANDARD TABLE OF line WITH KEY col1 WITH HEADER LINE.
*
*DO 10000000 TIMES.
*  itab-col1 = sy-index.
*  itab-col2 = sy-index.
*  itab-col3 = sy-index.
*  INSERT TABLE itab.
*ENDDO.
*
*SORT itab BY col1 col2 col3.
*
*READ TABLE itab WITH KEY col1 = 5000 col2 = 100 col3 = 999999.
<예제 5-12> - BINARY SEARCH 사용하는 경우

*TYPES: BEGIN OF line,
*         col1 TYPE i,
*         col2 TYPE i,
*         col3 TYPE i,
*       END OF line.
*
*DATA itab TYPE STANDARD TABLE OF line WITH KEY col1 WITH HEADER LINE.
*
*DO 10000000 TIMES.
*  itab-col1 = sy-index.
*  itab-col2 = sy-index.
*  itab-col3 = sy-index.
*  INSERT TABLE itab.
*ENDDO.
*
*SORT itab BY col1 col2 col3.
*
*READ TABLE itab WITH KEY col1 = 5000 col2 = 100 col3 = 999999 BINARY SEARCH.

- BINARY SEARCH가 일반 Search보다 READ 속도가 더 빠르지만, 데이터 건수가 많을 수록 SORT하는데 들어가는 시간이 BINARY SEARCH로 얻을 수 잇는 시간 감소량보다 더 많을 수 있기에 적절히 사용해야한다.

 

3. BINARY SEARCH vs. Sorted

- Sorted Table에서 READ 구문을 사용하는 것이 Standard Table에서 Sort 쓰고 BINARY SEARCH 쓰는 것 보다 속도가 더 빠르다.

<예제 5-13> - Sorted Table에서 READ 구문을 사용하기

*TYPES: BEGIN OF line,
*         col1 TYPE i,
*         col2 TYPE i,
*         col3 TYPE i,
*       END OF line.
*
*DATA itab TYPE SORTED TABLE OF line WITH UNIQUE KEY col1 WITH HEADER LINE.
*
*DO 10000000 TIMES.
*  itab-col1 = sy-index.
*  itab-col2 = sy-index.
*  itab-col3 = sy-index.
*  INSERT TABLE itab.
*ENDDO.
*
*READ TABLE itab WITH KEY col1 = 5000 col2 = 100 col3 = 999999.

 

4. Hashed Table 속도 측정
<예제 5-14>

*TYPES: BEGIN OF line,
*         col1 TYPE i,
*         col2 TYPE i,
*         col3 TYPE i,
*       END OF line.
*
*DATA itab TYPE HASHED TABLE OF line WITH UNIQUE KEY col1 WITH HEADER LINE.
*
*DO 15000000 TIMES.
*  itab-col1 = sy-index.
*  itab-col2 = sy-index.
*  itab-col3 = sy-index.
*  INSERT TABLE itab.
*ENDDO.
*
*READ TABLE itab WITH KEY col1 = 999999.

 

<구문 별 인터널 테이블 타입에 따른 속도 차이>

  • APPEND : Standard > Hashed > Sorted
  • READ : Hashed > Sorted > Standard

<인터널 테이블 타입에 따른 접근 방법 차이>

  Stnadard table Sorted Table Hash Table
Index Access Yes Yes  No
Key Access Yes Yes Yes
Key Values Not Unique Unique / Not Unique Unique
권장되는 Access 방법 Index 권장 Key 권장 Key만 사용

5. 인터널 테이블 명령어

1. 인터널 테이블 값 할당

- 인터널 테이블도 MOVE 구문을 사용해 값 할당 가능.

- 헤더라인 있는 인터널 테이블은 헤더라인 값만 복사.

MOVE itab1 TO itab2.           ( "itab2 = itab1"과 같다.)

- BODY를 복사하고 싶으면

MOVE itab1 [  ] To itab2 [  ].        ("itab2 [   ]  =  itab1 [   ]"과 같다.) 

- 다만 itab 타입이 같아야 한다.

<예제 5-15>

*TYPES: BEGIN OF t_line,
*         col1 TYPE i,
*         col2 TYPE i,
*       END OF t_line.
*
*DATA: gt_itab1 TYPE STANDARD TABLE OF t_line WITH HEADER LINE, *      gt_itab2 TYPE STANDARD TABLE OF t_line,
*      gs_wa    LIKE LINE OF gt_itab2.
*
*DO 5 TIMES.
*  gt_itab1-col1 = sy-index.
*  gt_itab1-col2 = sy-index * 2.
*  INSERT TABLE gt_itab1.
*ENDDO.
*
*MOVE gt_itab1[] TO gt_itab2.
*
*LOOP AT gt_itab2 INTO gs_wa.
*  WRITE: / gs_wa-col1, gs_wa-col2.
*ENDLOOP.

 

2. 인터널 테이블 초기화

<인터널 테이블 초기화하는 구문>

(1) CLEAR

- 메모리 공간을 반환하지만 처음 메모리 양을 요구한 정보는 삭제하지 않는다.(?? value 값은 삭제하지 않는다는말임?)

- 헤더라인이 있는 인터널 테이블이라면 CLEAR 구문으로 헤더라인만 삭제한다.

- 헤더라인이 없는 인터널 테이블이라면 CLEAR ITAB만으로도 BODY를 Clear 한다.

- 헤더라인이 있는 인터널 테이블의 BODY를 삭제하려면 "CLEAR ITAB[ ]."으로 한다.

 

(2) REFRESH

- 인터널 테이블의 데이터만 지우고, 메모리 공간은 그대로 갖고 있다.(????????)

- 테이블 내용만 삭제한다.

 

(3) FREE

- 테이블 내용을 삭제하고, 메모리 공간을 반환한다.(??????)

<예제 5-16>

*DATA: BEGIN OF gs_line,
*        col1    TYPE i,
*        col2(1) TYPE c,
*      END OF gs_line.
*
*DATA: gt_itab LIKE STANDARD TABLE OF gs_line.
*
*gs_line-col1 = 1.
*gs_line-col2 = 'A'.
*INSERT gs_line INTO TABLE gt_itab.
*
*  REFRESH gt_itab.                                       1. REFRESH로 인터널 테이블 초기화
(** FREE itab. )
(** CLEAR itab. )
*
*IF gt_itab IS INITIAL.                                    2. IF문 돌아감.(WRITE구문 수행)
*  WRITE : 'Internal table has no data.'.
*  FREE gt_itab.                                           3. FREE gt_itab으로 메모리 사용 반환(????????)
*ENDIF.

Q) 차이를 잘 모르겠음.

 

3. 인터널 테이블 정렬

1. SORT

- Standard나 hashed 타입의 인터널 테이블을 정렬하기 위해서

SORT ITAB [ASCENDING | DESCENDING]

를 사용한다.

- SORT 정렬의 기본 값은 ASCENDING이다.

- Sorted Table에서 SORT명령어를 사용하면 Syntax Error를 만나게 된다.

 

2. SORT 칼럼 지정

- 정렬이 필요한 칼럼을 임의로 지정하고 싶은 경우.

SORT ITAB [ ASCENDING | DESCENDING ]
    BY f1 [ ASCENDING | DESCENDING ]
     ....
         fn [ ASCENDING | DESCENDING ].

 

3. Stable SORT

- SORT 명령어 사용하면 Sort Sequence가 변하는데 Stable Sort 구문을 활용하면 Sort Sequence가 보존된다.

SORT Itab ... STABLE.

- STABLE SORT가 뭐냐면 예를들어

1) [ 3, 1, 2, 1] 의 문자열이 있는데

2) 1이 두개 있지만 순서대로 나타내자면 [ 3(1), 1(2), 2(3), 1(4)]로 나타낼 수 있다.

3) 이 문자열을 정렬하면 [ 1(2), 1(4), 2(3), 3(1) ] 로 중복된 숫자 1끼리도 순서가 정렬이 된다는 것.

<예제 5-17>

*  DATA : BEGIN OF gs_line,
*           col1 TYPE c,
*           col2 TYPE i,
*         END OF gs_line.
*
*  DATA gt_itab LIKE STANDARD TABLE OF gs_line WITH NON-UNIQUE KEY col1.
*
*  gs_line-col1 = 'B'.
*  gs_line-col2 = 3.
*  APPEND gs_line TO gt_itab.
*
*  gs_line-col1 = 'C'.
*  gs_line-col2 = 4.
*  APPEND gs_line TO gt_itab.
*
*  gs_line-col1 = 'A'.
*  gs_line-col2 = 2.
*  APPEND gs_line TO gt_itab.
*
*  gs_line-col1 = 'A'.
*  gs_line-col2 = 1.
*  APPEND gs_line TO gt_itab.
*
*  SORT gt_itab.
*  PERFORM write_data.
*
*  SORT gt_itab BY col1 col2.
*  PERFORM write_data.
*
*  SORT gt_itab BY col1 DESCENDING col2 ASCENDING.
*  PERFORM write_data.
*
*  FORM write_data .
*    LOOP AT gt_itab INTO gs_line.
*      WRITE : / gs_line-col1, gs_line-col2.
*    ENDLOOP.
*    ULINE.
*  ENDFORM.

 

4. 인터널 테이블 속성 알아내기

- 인터널 테이블 속성을 알려면 DESCRIBE구문을 사용.

- LINES는 인터널 테이블에 존재하는 현재 라인 수 반환

- OCCURS는 인터널 테이블의 초기 라인 수를 반환

- KIND는 인터널 테이블의 종류를 반환

- 'T'는 Standard table, 'S'는 Sorted Table, 'H'는 Hashed table을 의미

DESCRIBE TABLE itab [ LINES gv_line] [OCCURS gv_init] [KIND gv_kind].
<예제 5-18>

*DATA: BEGIN OF gs_line,
*        col1 TYPE c,
*        col2 TYPE i,
*      END OF gs_line.
*
*DATA gt_itab LIKE STANDARD TABLE OF gs_line INITIAL SIZE 10.
*
*DATA: gv_line TYPE i.
*
*DO 20 TIMES.
*  gs_line-col1 = sy-index.
*  gs_line-col2 = sy-index * 2.
*  INSERT gs_line INTO TABLE gt_itab.
*ENDDO.
*
*DESCRIBE TABLE gt_itab LINES gv_line.
*WRITE: / 'Internal Table Line is :', gv_line.           "Internal Table Line is :    20"

Q) 이게 어디 필요함??????

 

 

출처: https://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788965400288

 

Easy ABAP 2.0 - 교보문고

기본 이론과 실무 예제로 새롭게 꾸민『Easy ABAP 2.0』. 기본 이론과 예제 프로그램의 실습으로 단계적으로 ABAP 프로그램을 완성해갈 수 있도록 구성된 교재이다. 이론 부분은 1장 ~ 11장으로 구성��

www.kyobobook.co.kr