메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Dbstudy (토론 | 기여)님의 2025년 8월 8일 (금) 23:57 판
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

MERGE 조인

  • 정확한 명칭은 'MERGE JOIN' 또는 'SORT MERGE JOIN')
  • SORT(정렬) 후 MERGE(합치다) 의 의미

MERGE 조인이 필요한 경우

  1. 조인에 사용되는 양쪽 테이블이 이미 정렬되어 있거나, 정렬 비용이 크지 않은 경우
  2. 대량의 데이터에 대해 효율적인 조인이 필요할 때

MERGE 조인 동작 원리

  1. 조인에 참여하는 두 테이블의 조인 컬럼을 기준으로 정렬(sorting).
  2. 두 데이터 집합을 동시에 순차적 으로 탐색하면서 일치하는 조건이 있는 행을 찾아 조인 결과를 만듭니다.
  3. 두 개의 정렬된 리스트를 한 번에 훑는 것과 비슷하게 동작합니다.

장점

  1. 대량 데이터 조인에 효율적
  2. 인덱스가 없는 경우에도 성능이 좋은 편임

단점

  1. SORT 단계가 필요하므로 메모리 및 디스크 I/O를 소모
  2. 작은 데이터셋에는 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')


설명

  1. 양쪽 리스트가 이미 정렬되어 있다는 가정 하에 두 인덱스를 비교해 가면서 일치하는 id를 찾고, 일치하지 않으면 더 작은 쪽 인덱스만 증가시켜 탐색하는 방식.
  2. Oracle의 MERGE JOIN과 거의 동일한 논리적 방식입니다.