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) ... (계속 스캔)
  1. Build Phase (생성 단계): 두 테이블 중 로우 수가 적은 테이블(Build Input)을 선택하여 해시 함수를 적용해 메모리에 해시 테이블을 생성합니다.
  2. 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)'을 만들어 둔 다음, 엄청나게 두꺼운 영어 원서를 읽으면서 모르는 단어가 나올 때마다 책을 뒤적이지 않고 즉각적으로 뜻을 떠올리는 것과 같습니다. 단, 내 머리(메모리) 용량보다 단어장이 커버리면 머리에 쥐가 납니다.