소트 머지 조인의 두 단계
➡️ 양쪽 테이블을 각각 소트한 후, 위쪽 테이블 기준으로 아래쪽 테이블과 머지 조인한다.
-- < 원본 쿼리 >
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.최종주문금액 >= 2000
-- ↓ 수행과정 풀이 ↓
-- 1) 사원데이터를 조인 컬럼인 사원번호 순으로 정렬
-- => 결과 집합은 PGA영역의 Sort Area에 저장
-- (PGA에 담을 수 없을 정도로 크면 Temp테이블 스페이스에 저장)
select 사원번호, 사원명, 입사일자
from 사원
where 입사일자 >= '19960101'
and 부서코드 = 'Z123'
order by 사원번호;
-- 2) 고객 데이터를 조인컬럼인 관리자사원번호 순으로 정렬
-- => 결과 집합은 PGA영역의 Sort Area에 저장
-- (PGA에 담을 수 없을 정도로 크면 Temp 테이블스페이스에 저장)
select 고객번호, 고객명, 전화번호, 최종주문금액, 관리사원번호
from 고객 c
where 최종주문금액 >= 2000
order by 관리사원번호;
-- 3) PGA(또는 Temp 테이블스페이스)에 저장한 사원 데이터를 스캔하면서
-- 위에서 저장한 고객 데이터와 조인한다
-- (조인하는 과정을 PL/SQL로 표현)
begin
for outer in (select * from PGA에_정렬된_사원)
loop -- outer 루프
for inner in (select * from PGA에_정렬된_고객 where 관리사원번호 = outer.사원번호)
loop -- inner 루프
dbms_output.put_line( ... );
end loop;
end loop;
end;
Sort Area에 저장한 데이터 자체가 인덱스 역할을 하므로 소트 머지 조인은 조인 컬럼에 인덱스가 없어도 사용 가능하다