조인 튜닝
조인 순서와 NL, Hash, Sort Merge 조인 선택 기준을 성능 관점에서 다시 정리합니다.
출제 빈도 ★★★★☆ 관련 문제 3개 |
NLHashSort Merge 조인 튜닝의 핵심
조인 튜닝은 크게 두 가지를 결정하는 일입니다.
- 어떤 테이블을 먼저 읽을 것인가
- 어떤 조인 방식을 사용할 것인가
같은 SQL도 작은 결과부터 시작하면 빠르고, 큰 결과를 먼저 만들면 느려질 수 있습니다.
조인 순서
보통은 조건으로 많이 줄어드는 테이블을 먼저 읽는 것이 유리합니다.
SELECT *
FROM orders o
JOIN customer c ON c.customer_id = o.customer_id
WHERE o.order_date >= DATE '2026-04-01'
AND o.order_date < DATE '2026-05-01';
주문일 조건으로 orders가 크게 줄어든다면 orders를 먼저 읽는 계획이 유리할 수 있습니다. 반대로 특정 VIP 고객 한 명의 주문을 찾는다면 customer 조건에서 시작하는 것이 더 나을 수 있습니다.
NL 조인 튜닝
Nested Loop 조인은 바깥쪽 결과의 각 행마다 안쪽 테이블을 찾아가는 방식입니다.
유리한 조건:
- 바깥쪽 결과가 작습니다.
- 안쪽 조인 컬럼에 인덱스가 있습니다.
- 빠른 응답이 필요한 OLTP 단건 조회입니다.
불리한 조건:
- 바깥쪽 결과가 큽니다.
- 안쪽 테이블을 반복해서 많이 읽습니다.
- 안쪽 조인 컬럼에 적절한 인덱스가 없습니다.
Hash 조인 튜닝
Hash 조인은 작은 쪽으로 해시 테이블을 만들고 큰 쪽을 읽으며 매칭합니다.
유리한 조건:
- 대용량 등가 조인입니다.
- 인덱스 효과가 낮습니다.
- 배치성 집계나 대량 조회입니다.
주의할 점:
- 등가 조인에 적합합니다.
- 메모리가 부족하면 임시 공간 사용으로 느려질 수 있습니다.
- 아주 적은 결과에는 해시 구성 비용이 부담이 될 수 있습니다.
Sort Merge 조인 튜닝
Sort Merge 조인은 양쪽을 조인 키로 정렬한 뒤 병합합니다.
유리한 조건:
- 양쪽이 이미 정렬되어 있거나 정렬 비용이 낮습니다.
- 범위 조인이 포함됩니다.
- 대용량 데이터를 순차적으로 처리하는 편이 낫습니다.
불리한 조건:
- 정렬 대상이 크고 메모리가 부족합니다.
- 작은 결과를 빠르게 찾는 쿼리입니다.
조인 튜닝 체크리스트
| 질문 | 의미 |
|---|---|
| 먼저 읽는 테이블이 충분히 작아지는가 | 조인 시작점 확인 |
| 조인 조건 컬럼에 인덱스가 있는가 | NL 조인 가능성 확인 |
| 조인 조건이 등가 조건인가 | Hash 조인 가능성 확인 |
| 정렬 비용이 큰가 | Sort Merge 부담 확인 |
| 중간 결과가 폭증하지 않는가 | 잘못된 조인 순서 탐지 |
한 문장 요약
조인 튜닝은 작은 결과를 먼저 만들고, 데이터 양과 조건에 맞는 조인 방식을 고르는 일입니다.