4.2장 소트 머지 조인
친절한 SQL 튜닝 4.2장
소트 머지 조인은 언제 사용할까?
조인 컬럼에 인덱스가 없을 때, 옵티마이저는 NL 조인 대신 소트 머지 조인이나 해시 조인을 선택한다.
해시 조인이 더 효율적이긴 하지만, 대량 데이터를 조인할 때 유용하게 사용된다.
조인에서 중요한 튜닝 포인트는?
SQL이 조인을 수행할 때, 그 작업에 사용하는 메모리가 어디인지(SGA인지 PGA인지)를 이해해야 진짜 튜닝이 가능하다.
정렬(Sort), 해시(Hash) 작업은 → SGA가 아닌 PGA에서 발생
PGA가 부족하면 디스크 TEMP 공간을 쓰게 되어 쿼리 성능이 급격히 저하됨
1. SGA & PGA
공유 여부
여러 세션이 공유
세션(프로세스) 전용
주요 용도
- SQL 파싱 결과 캐싱- 버퍼 캐시로 디스크 I/O 최소화
- 정렬(SORT)- 해시 조인(HASH JOIN) 등 연산용 메모리
위치
인스턴스 메모리
세션별 프로세스 메모리
병목 발생 시
SQL 재사용 안 됨, I/O 증가
TEMP 사용으로 성능 저하 발생
소트 머지 조인과 해시 조인은 PGA 사용량이 많음
SQL 튜닝 시 →
PGA_AGGREGATE_TARGET
,WORKAREA_SIZE_POLICY
설정도 함께 봐야 함조인 방식에 따라 병목 지점이 SGA인지 PGA인지 달라짐
2. 기본 메커니즘
입력 집합 2개를 정렬 (Sort)
정렬된 상태에서 병합하며 조인 (Merge)
즉, 정렬 → 병합
이라는 2단계 프로세스를 가진다.
3. 왜 빠른가?
정렬된 데이터의 병합(Merge)은 매우 빠른 연산
→ 마치 두 개의 오름차순 배열을 하나로 합치는 것과 유사
특히 양쪽 테이블이 이미 정렬되어 있다면 → 정렬을 생략하고 바로 Merge 가능
→ 즉, Sort 단계가 건너뛰어짐 → 성능 매우 우수
4. 해시 조인과의 차이
정렬 필요 여부
필요 (하지만 생략 가능)
필요 없음
성능 특징
정렬된 대용량 병합에 유리
메모리 기반 중간 해시테이블 생성에 유리
메모리 사용
PGA (정렬 및 병합)
해시 조인은 등치 조건일 때만 사용할 수 있다.
그래서 소트 머지 조인은 등치 조건이 아니거나 조인 조건이 없는 조인일 때 주로 사용한다.
5. 제어 방법
옵티마이저가 조인 방식 선택
→ 힌트로 제어 가능
SELECT /*+ USE_MERGE(A B) */ ...
인덱스가 없거나, 인덱스 무시 힌트 사용 시 자주 선택됨
6. 정리
소트 머지 조인의 특징
조인 방식
정렬 후 병합 (Sort → Merge)
사용 메모리
PGA 사용 (정렬 시)
디스크 사용 위험
PGA 부족 시 TEMP 사용
빠른 조건
이미 정렬된 입력, 병합 대상이 많을 때
제어 힌트
USE_MERGE
, NO_INDEX
, ORDERED
등
소트 머지 조인은 정렬만 잘 되면 매우 빠른 조인이다.
하지만 정렬이 필요하다는 점에서 PGA 튜닝과 TEMP I/O에 민감하므로 조인 방식 선택 시 메모리 구조까지 고려해야 한다.
Last updated