본문 바로가기
개발/Database

[Join Series] 2. Sort Merge Join

by Mingvel 2025. 3. 28.

 

Sort Merge Join

 

두번째로 다룰 조인 방식은 소트 머지 조인(Sort Merge Join)이다

 

이전 글에서 설명했던 NL 조인에 비해 다룰 내용이 비교적 많지 않아 글이 짧을 것으로 예상된다

 

소트 머지 조인은 NL 조인의 대량 데이터 조인 시 발생하는 단점을 극복하기 위해 주로 사용되었는데

 

소트 머지 조인이 무엇이고, 어떻게 동작하는지 알아보자

 


소트 머지 조인은

 

DB 프로세스에 독립적으로 할당된 PGA 영역Sort Area에 

 

조인 대상 컬럼을 기준으로 대상 테이블들을 모두 Sorting 하고 (결과 집합의 크기가 클 경우 Temp Table에 저장하기도 한다)

 

Sorting 된 각 테이블을 Merge 하는 단순한 과정으로 동작한다


A, B 테이블이 서로 조인하는 과정을 예로 들어보자

(A = Driving, B = Inner. where B.A_id = A.id)

 

  1. A 테이블을 조인 컬럼인 A.id 기준으로 정렬 및 filter
  2. B 테이블을 조인 컬럼인 B.A_id 기준으로 정렬 및 filter
  3. 1,2번의 결과 집합 Merge

위 매커니즘을 보면 (3번) Merge 작업In Memory (Sort Area)에서 수행하고 (1번), (2번) 작업은 Index 조차 필요 없다

 

Index 생성도 필요 없고, NL 조인보다 성능도 좋을 테니 소트 머지 조인 사용이 장떙 아니야?라고 생각할 수 있다

 

물론 경우에 따라 NL 조인보다 빠른 것도 사실이지만

 

간과하지 말아야 할 소트 머지 조인의 특징이 있다

  • (1번), (2번) 머지 대상 데이터를 가져오는 과정에서 NL 조인과 동일하게 랫치 획득 및 Table Access 작업이 수행된다
  • (1번), (2번) 머지 대상 데이터 크기가 크다면, Temp Table에 저장되어 In Memory 활용 효율성이 떨어질 수 있다
  • 반영구적인 Index를 사용하는 NL 조인과 다르게, Memory를 사용하는 소트 머지 조인 구조 상, 재사용성이 떨어진다

한마디로 소트 머지 조인은 조인을 위해 인덱스를 실시간으로 생성하는 것이라고 볼 수 있다

 

Sorting 하는 두 테이블을 정렬한 다음에는 NL 조인과 동일하게 동작하지만, 

 

PGA 영역에 저장한 데이터를 이용하기에 빠른 것 또한 특징이다

 

조인 대상을 건건이 조회하는 NL 조인은 조인 대상 컬럼의 인덱스 유무에 큰 영향을 받지만

 

소트 머지 조인은 인덱스의 유무에 영향을 받지 않는다

 

한마디로 조인 대상 컬럼에 인덱스가 없는 상황에서 두 테이블을 각각 읽어 조인 대상 집합을 줄일 수 있을 때 큰 효율을 발휘한다

 

지금까지 설명한 소트 머지 조인은 PGA 영역에서 정렬된 대량 데이터를 머지하며 NL 조인의 단점을 극복할 수 있는 하나의 사례로 소개했지만

 

앞으로 소개할 해시 조인의 등장으로 소트 머지 조인의 대우도 예전만 못한 것 또한 사실이다 (대부분의 경우 해시 조인이 더 빠르다..)

 

그럼에도 불구하고 해시 조인 대신 소트 머지 조인이 사용되는 케이스가 있으니 그것은 바로

 

조인 조건식이 '='이 아닌 경우 이다

 

다음 글에서 설명하겠지만 해시 조인은 조인 조건이 '='이 아닐 때 사용할 수 없다

 

그 외에 두 조인 테이블의 카데시안 곱(Cross Join)을 만들 때 또한 버퍼 캐시를 반복적으로 경유하지 않는 소트 머지 조인이 유리하다

 

소트 머지 조인은 이 정도로 알아보고 다음 글에서 소트 머지 조인의 기를 죽인 해시 조인에 대해 알아보도록 하자

 

 

 

 

 

반응형

댓글