본문 바로가기
프로그래밍

SQL 튜닝 심화: 조인 튜닝 전략 완전 정복

by 유형제맘 2025. 8. 8.

조인 튜닝의 중요성

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
통계 정보 부정확 실행 계획 확인 후 조정

실무 튜닝 절차

  1. 현재 실행 계획 확인 (EXPLAIN 또는 EXPLAIN PLAN)
  2. 조인 순서 변경 — 작은 테이블을 먼저 읽기
  3. 인덱스 최적화 — Nested Loop 시 인덱스 필수
  4. 조인 방식 힌트 사용 — USE_NL, USE_HASH, USE_MERGE
  5. 테스트 & 검증 — 응답 시간 비교

실습 예시

-- 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;

NESTED LOOPS 결과

-- 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;

HASH JOIN 결과

-- 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;

MERGE JOIN 결과

결론

  • 조인 튜닝은 SQL 성능 최적화의 핵심입니다.
  • 소량 ↔ 대량 데이터: Nested Loop
  • 대량 ↔ 대량: Hash Join
  • 이미 정렬: Merge Join

실행 계획을 통해 조인 방식을 확인하고, 데이터 특성에 맞게 최적화하는 습관이 중요합니다.