Oracle SQL에서 성능 튜닝을 하다 보면

조인 순서나 방식만 바꿔도 쿼리 속도가 수십 배 차이 나는 경우가 있습니다.

이럴 때 사용하는 것이 바로 조인 힌트(Join Method Hint)입니다.
옵티마이저에게 “이 방식으로 조인하라”고 직접 지시할 수 있죠.

이 글에서는
✅ 조인 힌트가 왜 필요한지,
✅ 어떤 조인 방식이 있고,
✅ 각 힌트를 언제 써야 효과적인지
쉽고 실전적인 예제 중심으로 설명드리겠습니다.


🔍 조인 힌트란?

Oracle 옵티마이저는 SQL의 조인을 수행할 때
Nested Loop, Hash Join, Sort Merge Join 등 여러 방식 중 하나를 자동으로 선택합니다.

하지만 옵티마이저의 선택이 항상 최적은 아닐 수 있습니다.
이럴 때 조인 힌트를 사용하면, 개발자가 직접 조인 방식을 유도할 수 있습니다.

🧠 대표적인 조인 힌트 3종

1. 🔁 USE_NL(table) — Nested Loop Join

SELECT /*+ USE_NL(b) */ *
FROM emp a, dept b
WHERE a.deptno = b.deptno;
  • 설명: 외부 테이블(기준 테이블)의 각 행마다 내부 테이블을 반복 조회
  • 장점: 소량 데이터 조인 시 빠름
  • 단점: 내부 테이블이 크면 매우 비효율
  • 추천 상황:
    • 소량 데이터를 조인할 때
    • 내부 테이블에 인덱스가 있을 때


2. 🧊 USE_HASH(table) — Hash Join

SELECT /*+ USE_HASH(b) */ *
FROM emp a, dept b
WHERE a.deptno = b.deptno;
 
  • 설명: 내부 테이블을 해시 테이블로 만든 뒤 조인
  • 장점: 대용량 조인에 효율적
  • 단점: 해시 테이블 생성에 메모리 소모
  • 추천 상황:
    • 두 테이블 모두 중대형 이상일 때
    • 내부 테이블에 인덱스가 없을 때

 

3. 🔀 USE_MERGE(table) — Sort Merge Join

SELECT /*+ USE_MERGE(b) */ *
FROM emp a, dept b
WHERE a.deptno = b.deptno;
 
  • 설명: 양쪽 테이블을 정렬 후 병합하여 조인
  • 장점: 범위 조인 또는 정렬이 이미 되어 있다면 효율적
  • 단점: 정렬 비용이 클 수 있음
  • 추천 상황:
    • 조인 키가 정렬돼 있거나 인덱스를 사용해 정렬 가능한 경우
    • 등호(=) 외의 조인 조건 사용 (e.g., a.date BETWEEN b.start AND b.end)


💡 조인 힌트 사용 예제 비교

-- Nested Loop Join
SELECT /*+ USE_NL(b) */ *
FROM emp a, dept b
WHERE a.deptno = b.deptno;

-- Hash Join
SELECT /*+ USE_HASH(b) */ *
FROM emp a, dept b
WHERE a.deptno = b.deptno;

-- Sort Merge Join
SELECT /*+ USE_MERGE(b) */ *
FROM emp a, dept b
WHERE a.deptno = b.deptno;


📌 여기서 b는 내부 테이블이며, 힌트 대상입니다.


🔍 힌트 적용 확인 (실행 계획 보기)

힌트를 넣은 후에는 실제로 적용되었는지 확인하는 게 중요합니다.

EXPLAIN PLAN FOR
SELECT /*+ USE_HASH(b) */ ...
FROM emp a, dept b
WHERE a.deptno = b.deptno;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

또는 SQL Developer의 AUTOTRACE 기능으로 확인할 수도 있어요.


✅ 힌트 선택 기준 요약


조인 방식추천 상황힌트
Nested Loop소량 조인, 인덱스 있음USE_NL
Hash Join대용량, 인덱스 없음USE_HASH
Merge Join정렬된 키, 범위 조인USE_MERGE

⚠️ 주의사항

  • 조인 힌트를 쓴다고 항상 성능이 개선되는 건 아닙니다.
  • 옵티마이저가 힌트를 무시할 수도 있습니다 (구문 오류, 통계 정보 부족 등)
  • 반드시 실행 계획으로 확인하고 비교해보세요.

🏁 마무리

조인 방식만 바꿔도
💡 성능이 수 초 → 수 밀리초로 줄어들 수 있습니다.

Oracle 힌트를 적극 활용하되,
📈 반드시 실험과 확인을 병행하세요.