본문 바로가기

DB

Oracle 인덱스 적용 전·후 성능 비교

1. 인덱스란 

  • DB에서 조회 성능을 높이기 위한 자료구조
  • Primary Key, Unique 제약조건을 걸면 자동 생성
  • 자주 조회되는 컬럼에는 수동 생성

2. 인덱스가 없을 때 (Full Table Scan)

EXPLAIN PLAN FOR
SELECT * FROM employees WHERE salary = 5000;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

결과 예시

Id Operation Name

0 SELECT STATEMENT  
1 TABLE ACCESS FULL EMPLOYEES

 

  • employees 테이블 전체를 다 뒤져서 salary = 5000 인 행만 필터링
  • 소규모 테이블이면 괜찮지만, 수십만 건 이상이면 성능 병목

3. 인덱스 생성 후 (Index Range Scan)

CREATE INDEX idx_salary ON employees(salary);

EXPLAIN PLAN FOR
SELECT * FROM employees WHERE salary = 5000;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

결과 예시

Id Operation Name

0 SELECT STATEMENT  
1 TABLE ACCESS BY INDEX ROWID EMPLOYEES
2 INDEX RANGE SCAN IDX_SALARY

 

  • salary 컬럼에 인덱스 타서 바로 검색
  • 불필요한 데이터 스캔 최소화 → 성능 수십 배 향상

4. 실무에서 인덱스 잘 쓰는 법

  • PK, UNIQUE → 자동 인덱스 
  • WHERE, JOIN, ORDER BY에서 자주 쓰는 컬럼 → 수동 인덱스 추천 
  • UPDATE/INSERT/DELETE가 잦은 컬럼에는 x (쓰기 성능 저하)
  • 작은 테이블은 x (FULL SCAN이 오히려 빠름)

5. 성능 비교 팁

SET AUTOTRACE ON;

SELECT * FROM employees WHERE salary = 5000;
  • AUTOTRACE로 “실제 실행 건수, Consistent Gets, Physical Reads” 확인
  • 실행계획 + IO 비용 비교 가능

6. 요약

  • 인덱스 전: TABLE ACCESS FULL → 느림
  • 인덱스 후: INDEX RANGE SCAN → 빠름
  • 단, 무조건 인덱스가 좋은 건 아님 → 읽기 vs 쓰기 성능 트레이드오프 고려