MERGE 조인
- 정확한 명칭은 'MERGE JOIN' 또는 'SORT MERGE JOIN')
- SORT(정렬) 후 MERGE(합치다) 의 의미
MERGE 조인이 필요한 경우
- 조인에 사용되는 양쪽 테이블이 이미 정렬되어 있거나, 정렬 비용이 크지 않은 경우
- 대량의 데이터에 대해 효율적인 조인이 필요할 때
MERGE 조인 동작 원리
- 조인에 참여하는 두 테이블의 조인 컬럼을 기준으로 정렬(sorting).
- 두 데이터 집합을 동시에 순차적 으로 탐색하면서 일치하는 조건이 있는 행을 찾아 조인 결과를 만듭니다.
- 두 개의 정렬된 리스트를 한 번에 훑는 것과 비슷하게 동작합니다.
장점
- 대량 데이터 조인에 효율적
- 인덱스가 없는 경우에도 성능이 좋은 편임
단점
- SORT 단계가 필요하므로 메모리 및 디스크 I/O를 소모
- 작은 데이터셋에는 HASH JOIN이 더 빠를 수 있음
MERGE 조인 사용 예시
SELECT /*+ USE_MERGE(a b) */ * FROM table_a a JOIN table_b b ON a.id = b.id;
파이썬으로 MERGE JOIN 구현
- 두 리스트(또는 테이블)가 각각 다음과 같이 주어졌다고 가정
# table_a: (id, value) # table_b: (id, desc) table_a = [ (1, 'apple'), (2, 'banana'), (4, 'melon'), (5, 'peach') ]; table_b = [ (1, 'red'), (2, 'yellow'), (3, 'green'), (4, 'green') ]; join_result = merge_join(table_a, table_b) for row in join_result: print(row) def merge_join(table_a, table_b): # 두 테이블을 id 기준으로 정렬 (이미 정렬되어 있다고 가정) # 만약 정렬이 안 되어 있다면 아래 코드를 참고: # table_a = sorted(table_a, key=lambda x: x[0]) # table_b = sorted(table_b, key=lambda x: x[0]) i, j = 0, 0 result = [] while i < len(table_a) and j < len(table_b): id_a = table_a[i][0] id_b = table_b[j][0] if id_a == id_b: # 조건이 일치할 때 JOIN 결과에 추가 result.append((id_a, table_a[i][1], table_b[j][1])) i += 1 j += 1 elif id_a < id_b: i += 1 else: j += 1 return result
- 실행 결과:
(1, 'apple', 'red') (2, 'banana', 'yellow') (4, 'melon', 'green')
설명
- 양쪽 리스트가 이미 정렬되어 있다는 가정 하에 두 인덱스를 비교해 가면서 일치하는 id를 찾고, 일치하지 않으면 더 작은 쪽 인덱스만 증가시켜 탐색하는 방식.
- Oracle의 MERGE JOIN과 거의 동일한 논리적 방식입니다.