옵티마이저는 아래 상황에서 NL 조인 대신 소트 머지 조인이나 해시 조인을 선택한다.
해시 조인이 생기고 소트 머지 조인의 쓰임새가 예전만 못하지만, 대량 데이털르 조인할 때는 유용하다.
SGA (System Global Area, Shared Global Area)
PGA (Process/Program/Private Global Area)
select /*+ ordered use_merge(c)*/
e.사원번호, e.사원명, e.입사일자,
c.고객번호, c.고객명, c.전화번호, c.최종주문번호
from 사원 e, 고객 c
where c.관리사원번호 = e.사원번호
and e.입사일자 >= '19960101'
and e.부서코드 = 'Z123'
and c.최종주문금액 >= 20000
sort) 사원 데이터를 읽어 조인 컬럼인 사원번호 순으로 정렬한다. 정렬한 결과집합은 PGA 내의 Sort Area에 저장한다.
select 사원번호, 사원명, 입사일자
from 사원
where 입사일자 >='19960101'
and 부서코드 = 'Z123'
order by 사원번호
sort) 고객 데이터를 읽어 조인컬럼인 관리사원번호 순으로 정렬한다. 정렬한 결과집합은 PGA 내의 Sort Area에 저장한다.
select 고객번호, 고객명, 전화번호, 최종주문번호
from 고객 c
where 최종주문금액 >=20000
order by 관리사원번호
merge) PGA에 저장한 사원 데이터를 스캔하면서 PGA에 저장한 고객 데이터와 조인한다.
실제 조인 오퍼레이션은 NL 조인과 비슷하다.
사원 데이터를 기준으로 고객 데이터를 매번 Full scan하지 않는다. 고객 데이터가 정렬되어 있으므로 조인 대상 레코드가 시작되는 지점을 알고 아닌 지점에서 바로 멈출 수 있기 때문이다.
NL 조인의 치명적인 단점은 대량 데이터 조인에서 성능이 매우 느리다는 것이다.
→ 인덱스를 이용한 조인 방식으로 조인 과정에서 액세스하는 모든 블록을 랜덤 액세스 방식으로 ‘건건이’ DB 버퍼캐시를 경유해서 읽는다.
→ 즉, 읽는 모든 블록에 래치 획득 및 캐시버퍼 체인 스캔 과정을 거친다.
소트 머지 조인은 양쪽 테이블로부터 조인 대상 집합 (조인 조건 이외 필터 조건을 만족하는 집합)을 ‘일괄적으로’ 읽어 PGA에 저장한 후 조인한다.
→ PGA는 데이터를 읽을 때 래치 획득 과정이 없어 대량 데이터 조인에 유리하다.
소트 머지 조인도 양쪽 테이블로부터 조인 대상 집합을 읽을 때는 DB 버퍼캐시를 경유한다. 이때 인덱스를 이용하기도 하며, 이 때 버퍼캐시 탐색 비용과 랜덤 액세스 부하는 발생할 수 있다.
한때 NL 조인의 한계를 보완하였지만 대부분 해시 조인이 더 빠르다.
하지만 해시 조인은 조인 조건식이 등치 (=) 조건이 아닐 때 사용할 수 없다는 단점이 있다.
에서 주로 사용하게 된다.
소트 머지 조인 실행계획 : 양쪽 테이블을 각각 소트한 후, 위쪽 사원 테이블 기준으로 아래쪽 고객 테이블과 머지 조인한다.
MERGE JOIN
SORT (JOIN)
TABLE ACCESS (BY INDEX ROWID) OF '사원' TABLE
INDEX (RAGNE SCAN) OF '사원_X1' (INDEX)
SORT (JOIN)
TABLE ACCESS (BY INDEX ROWID) OF '고객' TABLE
INDEX (RAGNE SCAN) OF '고객_X1' (INDEX)