편집 요약 없음 |
|||
| (같은 사용자의 중간 판 하나는 보이지 않습니다) | |||
| 1번째 줄: | 1번째 줄: | ||
== MERGE 조인 == | == 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 조인이 필요한 경우
- 조인에 사용되는 양쪽 테이블이 이미 정렬되어 있거나, 정렬 비용이 크지 않은 경우
- 대량의 데이터에 대해 효율적인 조인이 필요할 때
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과 거의 동일한 논리적 방식입니다.