본문 바로가기

04번. IT 힌트얻기/▶ DB/ SQL

HASH JOIN


SELECT ....
 FROM aaa A, bbb B
 WHERE A.ID = B.ID
   AND A.TYPE = '0'
   AND B.NODE_TYPE = 'C';

A 테이블과 B 테이블이 각각 상수 조건을 가지고 각각의 JOIN 대상이 되는 집합을 구성하는 데,

A 테이블은 A.TYPE = '0' 조건만을 가지고 JOIN을 위한 중간 집합을 만든다.
만약 A.TYPE을 선행 컬럼으로 하는 INDEX가 있다면 해당 INDEX를 사용하여 ACCESS하고 없다면 Full Index Scan 또는 Full Table Scan을 통해 중간 집합을 구성한다.

B 테이블은 B.NODE_TYPE = 'C' 조건만을 가지고 JOIN을 위한 중간 집합을 만든다.
만약, B.NODE_TYPE을 선행 컬럼으로하는 INDEX가 있다면 해당 INDEX를 사용하여 Access하고 없다면 Full Index Scan 또는 Full Table Scan을 통해 중간 집합을 구성한다.

따라서 Hash Join은 Index를 사용하지 않는다는 오해는 없을 것이다.
그런데, Hash Join은 Hash Join의 메카니즘 상 작은 집합이 먼저 풀린 후 큰집합이 풀려서 Hash Join 되는 것이 속도면에서는 더 유리하다.
따라서 Optimizer Mode가 Cost Base라면 통계정보를 이용하여 더 작은 집합을 구성하는 테이블을 먼저 Driving할 것이다.

만약 A 테이블이 먼저 풀렸다면 Where 조건을 통과한 Row(Where 절에 포함된 컬럼과 Select List에 포함된 컬럼) 들은 A.ID가 Join을 위한 Hash Function에 적용된 후 동일한 Hash 값을 갖는 Row들 끼리 값은 Bucket에 모이게 되는데 이것을 Hash Table이라 한다.

그런 후 B테이블을 where 조건을 통과한 Row들은 B.Id가 Join을 위한 Hash Function에 적용된 후 같은 Bucket을 갖게되면 바로 조인한 후 결과를 Return한다.
이 경우는 메모리 안에서 Join이 가능한 경우이고, 그렇지 못하다면, A 테이블의 중간 집합과 B테이블의 중간 집합이 각각의 Partition을 Disk에 구성한 후 같은 Hash 값을 갖는 Partition 쌍 끼리 Join을 수행한 후 최종 결과를 Return한다.

< 아래에 기술된 Tip들은 Hash Join이 가진 문제들을 해결하는데 유용하다. >
1. 작은 테이블이 Driving Table(Build Input)이 되게하라.
2. Join Table 및 Column들이 적절하게 Analyze되었는지 확인하라.
3. Histograms은 불규칙한 컬럼 분포에 대해서만 권장되어진다. 필요하다면 ORDERED hint를 사용하여 Cost Based Optimizer에 의해 Join 순서를 조정할 수 있다.
4. 최소한 hash area size 만큼 hash join을 위해 메모리가 할당되도록 hash area size를 확인하라.
5. Temporary Tablespace에 I/O가 일어나지 않거나 최소화되도록 hash area size를 setting 하라. Hash Area Size = 1.6*Small Table Size

< Hash table, hash function, Bucket 에 대한 추가 설명 >

Hashing은 검색할 키 값을 비교하지 않고 검색할 수 있는 방법으로 번지를 이용한 정렬방식과 유사한 방식이다.
Hashing은 Hash Table을 사용하여 단 한 번의 접근으로 원하는 레코드를 검색할 수 있다.

Hash Table은 파일의 레코드의 키 값에 대응하는 해쉬주소와 레코드를 저장하는 공간은 Bucket으로 구성되어 있다.
Hashing의 절차는 다음과 같다.

1. 파일 내 모든 레코드의 키 값을 해쉬함수로 사용해 해쉬주소 Hash Address를 구한다.
2. 해쉬 주소로 해쉬 테이블을 구성, 해쉬 주소의 Bucket에 레코드를 입력한다.
3. 검색 대상 레코드의 키 값에 해쉬함수를 적용, 해쉬주소를 구한다.
4. 해쉬 테이블에서 해쉬주소로 레코드를 검색한다.







'04번. IT 힌트얻기 > ▶ DB/ SQL ' 카테고리의 다른 글

[SQL Function] INSTR  (0) 2011.09.29
대용량 데이터베이스를 위한 어드바이스  (0) 2011.09.29
SORT MERGE JOIN  (0) 2011.09.27
ORACLE NESTED LOOP JOIN  (0) 2011.09.27
SUM(DECODE...)  (0) 2011.09.09