조인 튜닝의 중요성
SQL에서 조인(Join)은 여러 테이블을 묶어 데이터를 조회할 때 필수적입니다. 하지만 조인 방식이 잘못되면 응답 속도가 수십 배 느려질 수 있습니다. 따라서 조인 방식의 차이를 이해하고 상황에 맞게 선택하는 것이 핵심입니다.
대표적인 조인 방식 3가지
1 Nested Loop Join
동작 원리
- 외부 테이블(Outer Table)에서 조건에 맞는 행을 하나씩 꺼내고,
- 내부 테이블(Inner Table)에서 해당 값에 맞는 데이터를 찾음
장점
- 소량 데이터 조인에 매우 효율적
- 인덱스와 함께 사용 시 성능 극대화
단점
- 대량 데이터 조인 시 느림
실행 계획 예시 용어
- NESTED LOOPS
2 Hash Join
동작 원리
- 두 테이블 중 작은 테이블을 해시 테이블로 만들고,
- 나머지 테이블과 해시 값을 비교해 매칭
장점
- 대량 데이터 조인에 유리
- 인덱스 없이도 빠를 수 있음
단점
- 해시 테이블 생성에 메모리 필요
- 작은 테이블이 메모리에 못 올라가면 성능 저하
실행 계획 예시 용어
- HASH JOIN
3 Merge Join (Sort Merge Join)
동작 원리
- 두 테이블을 각각 정렬한 후, 같은 키를 합침
장점
- 양쪽 테이블이 이미 정렬되어 있으면 빠름
- 인덱스가 있거나, 대량 데이터에 유리
단점
- 정렬 과정이 필요하면 느림
실행 계획 예시 용어
- MERGE JOIN
조인 선택 가이드
상황 | 추천 조인 방식 |
소량 데이터 vs 대량 데이터 | Nested Loop |
대량 데이터 vs 대량 데이터 (인덱스 없음) | Hash Join |
이미 정렬된 데이터 | Merge Join |
통계 정보 부정확 | 실행 계획 확인 후 조정 |
실무 튜닝 절차
- 현재 실행 계획 확인 (EXPLAIN 또는 EXPLAIN PLAN)
- 조인 순서 변경 — 작은 테이블을 먼저 읽기
- 인덱스 최적화 — Nested Loop 시 인덱스 필수
- 조인 방식 힌트 사용 — USE_NL, USE_HASH, USE_MERGE
- 테스트 & 검증 — 응답 시간 비교
실습 예시
-- Nested Loop 예시
SELECT /+ USE_NL(e d) /
e.employee_id, e.first_name, d.department_name
FROM employees e
JOIN departments d
ON e.department_id = d.department_id
WHERE e.salary > 5000;
-- Hash Join 예시
SELECT /+ USE_HASH(e d) /
e.employee_id, e.first_name, d.department_name
FROM employees e
JOIN departments d
ON e.department_id = d.department_id;
-- Merge Join 예시
SELECT /+ USE_MERGE(e d) /
e.employee_id, e.first_name, d.department_name
FROM employees e
JOIN departments d
ON e.department_id = d.department_id;
결론
- 조인 튜닝은 SQL 성능 최적화의 핵심입니다.
- 소량 ↔ 대량 데이터: Nested Loop
- 대량 ↔ 대량: Hash Join
- 이미 정렬: Merge Join
실행 계획을 통해 조인 방식을 확인하고, 데이터 특성에 맞게 최적화하는 습관이 중요합니다.
'프로그래밍' 카테고리의 다른 글
실행 계획(Execution Plan) 분석 (2) | 2025.08.10 |
---|---|
옵티마이저(Optimizer)의 이해 (2) | 2025.08.10 |
SQL 튜닝 심화: 실행 계획(Execution Plan) 완전 정복 (1) | 2025.08.08 |
SQL 튜닝 개요 및 전략|실무에서 바로 쓰는 성능 향상 기법 (3) | 2025.08.07 |
실무 SQL 튜닝 기법 완벽 정리 (3) | 2025.08.07 |