메뉴 건너뛰기

SAP 한국 커뮤니티



ABAP 해쉬테이블의 Read..comparing에 관하여

SARA 2007.03.16 20:57 조회 수 : 5207 추천:5





ABAP 해쉬테이블의 Read..comparing에 관하여.


http://blog.naver.com/wono77/140016230746



다음은 소스코드 예제).


 


REPORT  Z0818_READ
                                               .
DATA: BEGIN OF line occurs 0,
        col1 TYPE i,
        col2 TYPE i,
      END OF line.


 


DATA itab LIKE HASHED TABLE OF line WITH UNIQUE KEY col1. "Hashed Table
"DATA itab like line occurs 0.                    "Hashed Table이 아닐때


 


DO 4 TIMES.
  line-col1 = sy-index.
  line-col2 = sy-index ** 2.
  INSERT line INTO TABLE itab.
ENDDO.


 


line-col1 = 2.
line-col2 = 3.


 


READ TABLE itab FROM line INTO line COMPARING col2.


WRITE: 'SY-SUBRC =', sy-subrc.
SKIP.
WRITE: / line-col1, line-col2.


 


---------------------------------------------------------------


Read Comparing 테이블 내용).


 


*Table Itab


Col1 Col2


1     |   1


2     |   4


3     |   9


4     |  16


 


*Table line


Col1 Col2


2    |    3


 


 현재 itab 테이블은 col1은 유니크 키값으로 가지는 HASHED TABLE이다.


 먼저 해싱이 뭔지 부터 살펴보자.


 


*해싱:


-모든 키의 레코드를 산술 연산에 의해 한 번에 바로 접근할 수 있는 기법


 


*해싱의 단계


해시 함수(hash function)를 통해 탐색 키를 해시 테이블 주소로 변환
같은 테이블 주소로 사상되었을 경우에는 충돌을 해결(collision-resolution)해야 함


 


*해싱의 특징


-시간과 공간의 균형


-메모리의 제한이 없을 경우 : 키를 메모리 주소로 사용하면 어떤 탐색이든지 한 번의 메모리 접근으로 수행 가능
시간에 제한이 없을 경우 : 최소한의 메모리를 사용하여 데이터를 저장하고 순차 탐색
-해싱은 이러한 두 극단 사이에서 합리적인 균형을 이룰 수 있는 방법을 제공
-해싱을 사용하는 목적은 가용한 메모리를 효과적으로 사용하면서 빠르게 메모리에 접근하기 위함


*나눗셈법


다음과 같은 해시 함수 사용



m의 값은 주의해서 선택해야 함
만약 m을 2의 멱수, 예를 들어 2r으로 택한다면 h(k)는 k의 하위 r 비트의 값으로 됨
키가 십진수로 표현된 경우에도 10의 멱수가 아닌 m을 선택
따라서, m은 2의 멱수와 상당한 차이가 있는 소수를 선택하는 것이 좋음


 


*곱셈법


소수가 아닌 m을 택해야 하는 경우 사용
m의 값이 중요하지 않음
계산을 간단하게 하기 위해 보통 m은 2의 멱수, 즉 m=2p로 선택


 


*유니버설 해싱


해시 함수마다 아주 나쁜 성능을 보이는 입력 데이터의 패턴이 존재
실행시에 해시 함수의 큰 집합으로부터 임의의 해시 함수를 선택하도록 하여 해시 함수의 편향된 사용이 불가능하여 악의적인 사용자를 배제함


 


*체인법


동일 주소로 해시되는 모든 원소가 연결 리스트 형태로 연결됨


-장점


원소의 삭제가 용이


-단점


포인터 저장을 위한 기억공간이 필요
기억장소 할당이 동적으로 이루어져야 함


 


---------------------------------------------------------------------------------------


즉, 해쉬 테이블은 키값을 주소 값으로 매칭하되, 일정 계산 법에 의한 해쉬 값을 두어 필드를 해쉬값으로 변환하여 주소 값에 매칭.. 주소값들을 재 분류하여, 탐색에 걸리는 시간을 줄이는 데 주로 이용되는 법이란 것을 위의 설명에서 알게 되었다.


 


해쉬 테이블 itab이기 때문에 Read로 compare할 때 Read가 하나의 값만 가져오는 명령어 임에도 불구하고 여기서는 모든 값을 통짜로 읽어와서 비교하게 되는 것이다.(이것이 핵심)


 


다시 말하면, 해쉬 테이블로 보기때문에 Read로 읽어올때 itab의 모든 내용을 line 인터널 테이블과 비교하게 된다.


 


이제 다음단계...


 


해쉬테이블은 엔트리와 필드로 나눠지는데, 먼저 col2를 비교하겠다고했으므로(comparing col2) 필드를 비교하는데, 같은 값이 없으면 그 다음에는 엔트리를 비교한다.


 


필드에는 같은 값이 없으나, 엔트리에는 있으면 SubRC = 2가 된다.


 


다음 아밥 도움말 참조).


Addition 3a


... COMPARING f1 f2 ...


Effect


If the system find an entry, the system compares the subfields f1, f2, ... with the corresponding fields of the work area before they are transported into it.

The return value SY-SUBRC indicates whether any values were found that correspond to the search, and, if so, the result of the comparison:



SY-SUBRC = 0:
Entry found, field contents identical


SY-SUBRC = 2:
Entry found, field contents different
같은 엔트리는 찾았지만, 필드 내용에 같은게 없을 때.. 


SY-SUBRC > 2:
No entry found
아예 둘다 못찾으면 2보다 큰값으로 리턴. 거의 4정도..


If you want to instruct the system not to compare any fields (which is the default in any case), you can use the COMPARING NO FIELDS addition.    


 


----------------------------------------------------------------------------------


출력값 분석 )


 


line 의 col2는 itab-col2 값 1, 4, 9,16 어느것과도 같지는 않지만, col1값 2가 서로 일치하므로


itab의 index2값인 2,4가 찍히게 된다.


Read .... into ...에 의하여 line에도 2,4가 들어간다...


 


다른 관점에서 보자 )


 


만약 위의 주석을 바꿔서 itab을 internal Table로 선언한다면 어떻게 될까?


itab은 더 이상 해쉬 테이블이 아니므로, 1, 1 한 라인만 검사를 하게 되어..


같은값이 전혀 없어 sy-subrc=4 출력값은 검사했던 첫번째 값 1,1이 찍힌다.


 


.. 글 by wono77


* e-abap님에 의해서 게시물 이동되었습니다 (2007-04-15 20:22)