173. 소트 머지 조인 (Sort Merge Join)
핵심 인사이트: 양쪽 데이터를 각각 예쁘게 정렬(Sort)해두고, 첫 줄부터 쭉쭉 내려가며 지퍼를 채우듯 병합(Merge)하는 조인이다. 인덱스가 없어서 중첩 루프 조인(NL Join)이 끔찍하게 느려질 때 꺼내 드는 대용량 처리용 카드다.
Ⅰ. 소트 머지 조인 (Sort Merge Join)의 개념
조인할 두 테이블의 조인 컬럼을 기준으로 데이터를 먼저 각각 정렬(Sort)한 다음, 정렬된 결과를 순차적으로 스캔하면서 병합(Merge)하여 결과를 추출하는 방식입니다. 인덱스가 존재하지 않거나, 대량의 데이터를 동등(=) 또는 비동등(>, <, BETWEEN) 조건으로 조인할 때 유용하게 사용됩니다.
Ⅱ. 동작 원리 및 과정
[ 테이블 A (정렬 전) ] [ 테이블 B (정렬 전) ]
10, 50, 20 30, 10, 40, 20
│ │
▼ (1. 정렬 단계 - Sort) ▼
[ 테이블 A (정렬 후) ] [ 테이블 B (정렬 후) ]
10 10
20 20
50 30
40
│ │
▼ (2. 병합 단계 - Merge) ▼
[ 조인 결과 ]
(10, 10), (20, 20) ──▶ 순차 스캔으로 지퍼 닫듯 매칭
- Sort (정렬): 양쪽 테이블에서 조인 조건에 해당하는 데이터를 읽어와 (PGA 내의 Sort Area를 사용하여) 조인 키 기준으로 정렬합니다. 데이터가 크면 임시 디스크(Temp TableSpace)를 사용하여 정렬 오버헤드가 발생합니다.
- Merge (병합): 양쪽 모두 정렬되어 있으므로, 처음부터 순차적으로 스캔(Full Scan)하며 매칭되는 데이터를 즉시 찾아냅니다. 인덱스를 이용한 Random I/O가 발생하지 않습니다.
Ⅲ. 소트 머지 조인의 장단점
| 구분 | 설명 |
|---|---|
| 장점 | - 조인 컬럼에 인덱스가 없어도 빠른 조인이 가능합니다. - 대량의 데이터 조인 시 Random I/O가 발생하지 않아 NL 조인보다 유리합니다. - 동등( =) 조건뿐만 아니라 비동등(>, <, BETWEEN) 조건에서도 해시 조인(Hash Join)과 달리 사용 가능합니다. |
| 단점 | - 데이터를 정렬하는 데 많은 CPU와 메모리 리소스(Sort Area)를 소모합니다. - 데이터양이 메모리 크기를 초과하면 디스크 I/O가 발생하여 성능이 크게 저하될 수 있습니다. |
Ⅳ. 해시 조인(Hash Join)과의 비교
대량 데이터를 조인할 때는 대부분 해시 조인이 메모리 정렬 오버헤드가 없어 소트 머지 조인보다 빠르고 우수합니다. 그러나 해시 조인은 오직 동등(=) 조인에서만 사용할 수 있으므로, 대용량 데이터의 비동등 조인이 필요한 상황에서는 소트 머지 조인이 유일한 대안이 됩니다.
📢 섹션 요약 비유: 전교생 1,000명의 이름이 적힌 명단과 체육복 사이즈 명단을 짝지을 때, 이름표를 들고 매번 1,000장을 다 뒤지는 것(NL Join)이 아니라, 두 명단을 '가나다순'으로 예쁘게 정렬해 놓고 첫 장부터 동시에 넘기며 짝을 맞추는(Sort Merge) 방식입니다.