메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
편집 요약 없음
 
(같은 사용자의 중간 판 하나는 보이지 않습니다)
1번째 줄: 1번째 줄:
== MERGE 조인 ==
== MERGE 조인 ==
* 정확한 명칭은 'MERGE JOIN' 또는 'SORT MERGE JOIN'
{{틀:핵심
* SORT(정렬) 후 MERGE(합치다) 의 의미
|제목=''' <big>SORT MERGE 조인의 영문의 뜻 : SORT(정렬) 후 MERGE(합치다) 의 의미 </big>'''
|내용= ''' <big>정확한 명칭은 'MERGE JOIN' 또는 'SORT MERGE JOIN'</big>'''
}}


=== MERGE 조인이 필요한 경우 ===
=== MERGE 조인이 필요한 경우 ===

2025년 10월 22일 (수) 12:25 기준 최신판

MERGE 조인

  vpn_key SORT MERGE 조인의 영문의 뜻 : SORT(정렬) 후 MERGE(합치다) 의 의미

  playlist_add_check 정확한 명칭은 'MERGE JOIN' 또는 'SORT MERGE JOIN'

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과 거의 동일한 논리적 방식입니다.