메뉴 건너뛰기

bysql.net

2.3.4. 해쉬(Hash) 조인

- 대용량 처리의 선결조건인 랜덤과 정렬에 대한 부담을 해결수 있는 대안

- 연결 행위를 할때마다 인덱스를 경유하여 랜덤을 하지 않고 해쉬함수를 이용하여 파티션 단위로 처리함.

1. 용어 설명

- 해쉬 영역(Hash Area)

해쉬 조인을 수행하기 위해 메모리 내에 만들어진 영역( 비트맵 벡터 + 해쉬 테이블 + 파티션 테이블 으로 구성 )

해쉬 영역이 부족하면 디스크를 사용할 수 밖에 없어 수행속도에 지대한 영향을 미치게 되므로 적절하게 지정하는 것은 매우 중요!!

- 파티션(Partition)

하나의 파티션은 여러 개의 클러스터로 구성된다.

파티션 수를 많게 하면 적은 크기의 많은 파티션이 생성되기 때문에 비효율적인 I/O가 발생할 수 있다.

너무 적게 하면, 지나치게 큰 파티션이 생성되어 해쉬영역과 맞지 않을 수 도 있다.

- 클러스터(Cluster)

연속된 블록으로 되어 있으며 디스크와 I/O를 하는 단위( 파라메터 Hash_multiblock_io_count에 의해 동시 I/O하는 양이 결정).

물건을 찾을 때, 먼저 캐비닛(파티션)을 결정하고, 해당 서랍(클러스터)을 열어서 물건을 꺼내는 것과 매우 유사함

- 빌드입력(Build Input)과 검색입력(Probe Input)

빌드엽력 : 조인을 위해 먼저 액세스하여 필요한 준비를 해두는 처리

검색입력(검증) : 나중에 액세스하면서 조인을 수행하는 처리

조인 대상 집합이 이중에서 어느 역할을 담당했느냐에 따라서 처리 방법이나 수행속도에 많은 차이가 남.

- 인-메모리(In-memory) 해쉬조인과 유예 해쉬조인

빌드입력이 해쉬영역에 모두 위치할 수 있는 경우는 인-메모리(In-memory) 해쉬 조인을 수행, 그렇지 못한 경우 유예 해쉬 조인을 수행

- 비트맵 벡터(Bitmap Vector)

먼저 액세스 하는 빌드입력의 유일한 값을 생성해 두었다가 나중에 검색하는 검색 입력을 필터링하는데 사용

메모리에 정의하는 해쉬영역의 5%로 생성된다.

- 해쉬 테이블(Hash Table)

메모리 내에 만들어지며, 최종적으로 조인의 연결작업에서 대응되는 로우를 찾기 위한 해쉬 인덱스로 사용된다.

해쉬키값과 해쉬 클러스터의 주소를 가지고 있다.

- 파티션 테이블(Partition Table)

만약 빌드입력이 메모리 크기를 초과하여 파티션을 생성하게 되면 '파티션 테이블'에 관련정보가 저장된다.

 

2.3.4.1. 인-메모리 해쉬조인

인-메모리 해쉬조인은 빌드입력을 모두 메모리에 저장하고 해쉬 테이블을 만들어 검색 입력을 스캔하면서 조인을 수행한다.

비록 모양상으로는 랜덤이지만 거의 부담이 없는 랜덤을 수행하기 때문에 Sort Merge 조인처럼 연결을 위해 정렬을 해야 하거나 Nested Loops조인처럼 수많은 블록을 액세스하지 않아도 되므로 대용량 데이터의 조인에 매우 효과적이다.

2.3.4.2. 유예 해쉬조인

빌드입력의 일부라도 디스크에 저장을 할 수 밖에 없게 된다면 마치 정렬을 통해 연결을 하는 Sort Merge 조인처럼 무언인가 정렬과 유사한 효과를 얻을 수 있는 방법이 있어야 한다. 정렬을 하지 않고서도 연결이 가능하도록 데이터를 위치시키는 방법은 바로 해슁함수를 적용하는 것.

해쉬조인은 각각의 집합에 대해 먼저 해슁함수를 적용하여 같은 해쉬값을 갖는 파티션에 저장을 한 후 그들의 짝을 찾아 연결을 수행한다.

 

2.3.5. 세미(Semi) 조인

조인과 매우 유사한 데이터 연결 방법을 뜻한다.

서브쿼리를 사용했을 때 메인쿼리와의 연결을 하는 처리

2.3.5.1. 세미 조인의 개념 및 특징

-

2.3.5.2. 세미조인의 실행계획

-

가) Nested Loops 형 세미조인

-

나) Sort Merge 형 세미조인

-

다) 필터(Filter) 형 세미조인

-

라) 해쉬(Hash) 형 세미조인

-

마) 부정형(Anti) 형 세미조인

-