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 힌트를 적극 활용하되,
📈 반드시 실험과 확인을 병행하세요.