174. 해시 조인 (Hash Join)
핵심 인사이트: 대용량 데이터를 조인할 때 정렬(Sort)조차 버겁다면 해시 함수(Hash Function)가 답이다. 작은 테이블을 통째로 메모리에 '해시 맵(Hash Map)'으로 올려두고, 큰 테이블을 쭉 읽으면서 단번에 짝을 찾아내는 가장 파워풀한 대용량 동등(=) 조인 기법이다.
Ⅰ. 해시 조인 (Hash Join)의 개념
해시 조인은 조인할 두 테이블 중 크기가 작은 테이블을 읽어 메모리(Hash Area)에 해시 테이블을 생성한 후, 크기가 큰 테이블을 차례대로 스캔하면서 해시 함수를 적용해 해시 테이블의 값과 비교하여 매칭하는 방식입니다. 데이터 웨어하우스(DW)나 대규모 배치(Batch) 프로그램에서 필수적으로 사용됩니다.
Ⅱ. 해시 조인의 동작 2단계 (Build & Probe)
1. Build Phase (작은 테이블로 해시 맵 생성)
[ 부서 테이블 (작음) ] ──(해시 함수)──▶ [ 메모리 내 Hash Table ]
DEPT_ID: 10, 20 [ Hash(10) -> 주소 0x01 ]
[ Hash(20) -> 주소 0x05 ]
2. Probe Phase (큰 테이블을 스캔하며 탐색)
[ 사원 테이블 (큼) ] ──(해시 함수)──▶ [ Hash Table 검색 ] ──▶ 매칭 성공! (결과 리턴)
EMP 1 (Dept 10)
EMP 2 (Dept 20)
EMP 3 (Dept 10) ... (계속 스캔)
- Build Phase (생성 단계): 두 테이블 중 로우 수가 적은 테이블(Build Input)을 선택하여 해시 함수를 적용해 메모리에 해시 테이블을 생성합니다.
- Probe Phase (탐색 단계): 큰 테이블(Probe Input)을 Full Scan 하면서, 조인 컬럼에 동일한 해시 함수를 적용하여 메모리의 해시 테이블을 찔러보고 매칭되는 행을 추출합니다.
Ⅲ. 해시 조인의 특징 및 제약 조건
| 구분 | 설명 |
|---|---|
| 최고의 성능 | Random I/O(NL 조인 단점)도 없고, 데이터 정렬 오버헤드(Sort Merge 단점)도 없어 대용량 처리에 가장 빠릅니다. |
| 제약 1: 동등(=) 조인 전용 | 해시 함수의 특성상 값이 정확히 일치해야 하므로, 비동등(>, <, BETWEEN) 조건에서는 절대 사용할 수 없습니다. |
| 제약 2: 메모리 부하 | Build Input 테이블이 너무 커서 메모리(Hash Area)를 초과하면, 디스크 스왑(Temp 공간 사용)이 발생하여 성능이 폭락합니다. (이를 보완하기 위해 Grace Hash Join 사용) |
Ⅳ. 옵티마이저의 선택 기준
- 소량 OLTP ➔ NL Join (응답 속도 중시)
- 대량 비동등 조인 ➔ Sort Merge Join (해시가 안 될 때)
- 대량 동등 조인 / 배치 ➔ Hash Join (전체 스루풋 중시)
📢 섹션 요약 비유: 영어 단어장을 통째로 달달 외워서 머릿속에 '사전(Hash Map)'을 만들어 둔 다음, 엄청나게 두꺼운 영어 원서를 읽으면서 모르는 단어가 나올 때마다 책을 뒤적이지 않고 즉각적으로 뜻을 떠올리는 것과 같습니다. 단, 내 머리(메모리) 용량보다 단어장이 커버리면 머리에 쥐가 납니다.