본문 바로가기
SQL/심화

SQL튜닝 - Chapter04.조인튜닝 -2- 소트 머지 조인

by 유서담 2023. 8. 21.

조인 컬럼에 인덱스가 없을 때, 대량 데이터 조인이어서 인덱스가 효과적이지 않을 때, 옵티마이저는 

NL 조인 대신 소트 머지 조인이나 해시 조인을 선택한다. 

해시 조인을 사용할 수 없는 상황에서 대량 데이터를 조인하고자 할 때 소트 머지 조인은 유용하다.

 

소트 머지 조인과 해시 조인을 알려면 PGA에 대한 설명이 선행되어야 한다. 

 

SGA VS PGA

 

SGA ( System Global Area 또는 Shared Global Area ) 공유 메모리 영역. 서버 프로세스와 백그라운드 프로세스가 공통으로 액세스하는 데이터와 제어 구조를 캐싱하는 메모리 공간.

 

PGA ( Process / Program / Private Global Area ) 자신만의 고유 메모리 영역. 프로세스에 종속적인 고유 데이터를 저장하는 용도.

 

만약 할당받은 PGA 공간이 작아서 데이터를 모두 저장할 수 없을 때는 Temp 테이블 스페이스를 이용.

 

PGA는 다른 프로세스와 공유하지 않는 독립적인 메모리 공간이라 래치 메커니즘이 불필요.

따라서 같은 양의 데이터를 읽더라도 SGA 버퍼캐시에서 읽을 때보다 훨씬 빠르다.

 

 

소트 머지 조인 진행단계

1. 소트 단계 : 양쪽 집합을 조인 컬럼 기준으로 정렬.

2. 머지 단계 : 정렬한 양쪽 집합을 서로 머지(Merge).

 

Sort Area에 저장한 데이터 자체가 인덱스 역할을 하므로 소트 머지 조인은 조인 컬럼에 인덱스가 없어도 사용할 수 있는 조인 방식

 

 

소트 머지 조인이 빠른 이유

NL 조인은 모든 DBMS가 공통으로 제공하는 가장 전통적인 조인 방식이지만 대량 데이터 조인할 때 성능이 매우 느리다는단점이 존재한다.

 

이러한 문제를 해결하기 위해 소트 머지 조인이 개발된 이유이다.

 

소트 머지 조인은 Sort Area에 미리 정렬해 둔 자료구조를 이용한다는 점만 다를뿐 조인 프로세싱 자체는 NL조인과 같다.

프로세싱 자체는 같은데 왜 성능차이가 나는 걸까?

 

=

 

NL 조인은 '인덱스를 이용한' 조인 방식이다. 조인 과정에서 액세스하는 모든 블록을 랜덤 액세스하는 방식을 사용한다.

다시 말해, 인덱스든, 테이블이든, 읽는 모든 블록에 래치 획득 및 캐시버퍼 체인 스캔 과정을 거친다.

 

반면 소트 머지 조인은 양쪽 테이블로부터 조인 대상 집합을 일괄적으로 읽어 PGA에 저장한 후 조인한다.

PGA는 프로세스만을 위한 독립적인 메모리 공간이므로 데이터를 읽을 때 래치 획득 과정이 없다.

 

 

소트 머지 조인의 주용도

 

해시 조인의 등장으로 인해서 소트 머지 조인의 사용이 많이 줄었다.

그 이유는 해시 조인이 더 빠르기 때문.

그러나 해시 조인은 조인 조건식이 등치(=)조건이 아닐 때 사용할 수 없다는 단점이 있다.

 

소트 머지 조인은 이러한 상황에서 사용된다.

 

- 조인 조건식이 등치(=) 조건이 아닌 대량 데이터 조인

- 조인 조건식이 아예 없는 조인(Cross Join)

 

 

소트 머지 조인 특징 요약

 

소트 머지 조인은 조인을 위해 실시간으로 인덱스를 생성하는 것과 다름없다 ( CPU에 부하가 간다 )

PGA 영역에 저장한 데이터를 이용하기 때문에 빠르다.

 

NL 조인은 조인 컬럼에 대한 인덱스 유무에 크게 영향을 받지만, 소트 머지 조인은 영향을 받지 않는다

양쪽 집합을 개별적으로 읽고 나서 조인을 시작한다는 특징.  조인 컬럼에 인덱스가 없는 상황에서 두 테이블을 각각 읽어 조인 대상 집합을 줄일 수 있을 때 아주 유리하다.

( NL 조인은 왼쪽 테이블부터 읽지만 소트 머지는 두개를 같이 읽는다 )