Post

[Oracle 튜닝] 실행계획 비교 - Nested Loop vs Hash Join

[Oracle 튜닝] 실행계획 비교 - Nested Loop vs Hash Join

🔍 실습 목표

  • EMPDEPT 테이블을 조인할 때,
  • Nested Loop JoinHash Join의 실행계획 차이를 비교한다.
  • 인덱스 유무, 힌트 사용, 병렬 처리(PX) 영향도 함께 확인

✅ 실습 환경

  • Oracle ADB (Autonomous Transaction Processing)
  • SQL Developer
  • 계정: SCOTT
  • 기본 테이블: EMP, DEPT

🛠️ 1. 인덱스 존재 여부 확인 및 생성

1
2
3
4
5
6
7
-- 1-1. 인덱스 존재 여부 확인
SELECT INDEX_NAME, TABLE_NAME, COLUMN_NAME
FROM USER_IND_COLUMNS
WHERE TABLE_NAME = 'EMP';

-- 1-2. EMP.DEPTNO에 인덱스 생성
CREATE INDEX IDX_EMP_DEPTNO ON EMP(DEPTNO);

📊 2. 실행계획 비교

🔹 (1) 기본 실행계획

1
2
3
4
5
6
EXPLAIN PLAN FOR
SELECT E.ENAME, E.JOB, D.DNAME
FROM EMP E
JOIN DEPT D ON E.DEPTNO = D.DEPTNO;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
  • 조인 방식: NESTED LOOPS
  • DEPT: TABLE ACCESS FULL
  • EMP: INDEX RANGE SCAN (IDX_EMP_DEPTNO) + TABLE ACCESS BY INDEX ROWID
  • PX 병렬 처리 자동 적용됨

🔹 (2) Hash Join 힌트 적용

1
2
3
4
5
6
EXPLAIN PLAN FOR
SELECT /*+ USE_HASH(E D) */ E.ENAME, E.JOB, D.DNAME
FROM EMP E
JOIN DEPT D ON E.DEPTNO = D.DEPTNO;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
  • 조인 방식: HASH JOIN
  • EMP, DEPT 모두: TABLE ACCESS FULL
  • PX 병렬 처리 유지
  • 인덱스 무시하고 전체 테이블 스캔

📌 실행계획 비교 요약

항목기본 실행계획힌트 적용 (USE_HASH)
조인 방식Nested LoopsHash Join
EMP 접근인덱스 사용Full Scan
DEPT 접근Full ScanFull Scan
병렬 처리OO

🧠 튜닝 포인트 정리

조건추천 Join 방식
소량 데이터 + 인덱스 있음Nested Loop Join
대량 데이터 + 병렬 처리 고려Hash Join

옵티마이저는 데이터 양과 인덱스 유무, 병렬 환경 등을 고려하여 Join 전략을 자동 선택
→ 힌트를 통해 강제로 제어하며 성능 실험 가능

This post is licensed under CC BY 4.0 by the author.