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 쓰기 성능 트레이드오프 고려
'DB' 카테고리의 다른 글
| Oracle SQL – 테이블 생성, 시퀀스, 제약조건 정리 (0) | 2025.06.05 |
|---|---|
| Oracle SQL 테이블 설계부터 집계함수까지 (0) | 2025.06.05 |
| Oracle 데이터 타입 & 제약조건(Constraints) 정리 (0) | 2025.06.02 |
| Oracle 11g 조인 정리 (0) | 2025.05.30 |
| Oracle SQL 예제 (0) | 2025.05.30 |