1. 인덱스(Index)란?
인덱스는 데이터를 빠르게 찾기 위한 자료구조다. 책에서 원하는 내용을 찾을 때 맨 앞의 목차를 먼저 보고 페이지를 찾는 것처럼, 오라클에서는 인덱스를 이용해 테이블 전체를 읽지 않고 필요한 데이터만 빠르게 조회한다.
2. 인덱스가 필요한 이유
❌ 인덱스가 없다면?
- 테이블 전체를 처음부터 끝까지 읽는 FULL TABLE SCAN 발생
- 데이터가 많을수록 조회 속도 급격히 저하
SELECT *
FROM EMP
WHERE EMPNO = 7788;
✔️ 인덱스가 있다면?
- 인덱스를 통해 EMPNO = 7788위치를 바로 찾아감
CREATE INDEX IND_EMP_EMPNO ON EMP(EMPNO);
3. 오라클 인덱스 내부 구조
📌 오라클의 기본 인덱스는 B-Tree 구조다.
📌 오라클은 인덱스에서 ROWID를 찾고, 그 ROWID를 통해 실제 테이블 데이터를 조회한다.
Root -> Branch -> Leaf
- Root: 시작 지점
- Branch: 중간 경로
- Leaf: 실제 ROWID(데이터 위치) 저장
4. 인덱스 종류
① 단일 컬럼 인덱스
CREATE INDEX INX_EMP_NAME ON EMP(NAME);
② 복합 인덱스
- 컬럼 순서 중요!!!
- (DEPTNO, JOB) -> DEPTNO 조건 없으면 인덱스 제대로 못 탐
CREATE INDEX IDX_EMP_DEPT_JOB ON EMP(DEPTNO, JOB);
③ UNIQUE 인덱스
- 중복 값 허용❌
- PRIMARY KEY 생성 시 자동 생성됨
CREATE UNIQUE INDEX IDX_EMP_EMPNO ON EMP(EMPNO);
5. 인덱스가 잘 타는 WHERE 조건
✔️ 인덱스 잘 탐
WHERE EMPNO = 7788;
WHERE ENAME = 'SMITH';
WHERE SAL BETWEEN 1000
AND 3000;
❌ 인덱스 안 타는 경우 (주의!)
① 함수 사용
WHERE TO_CHAR(HIREDATE, 'YYYY') = '2024';
② 컬럼 가공
WHERE SAL + 100 = 3000;
③ LIKE 앞에 %
WHERE ENAME LIKE '%ITH';
6. 인덱스와 INSERT / UPDATE /DELETE 관계
인덱스는 조회 속도는 빠르게 하지만, DML 성능에는 영향을 준다.
| 작업 | 영향 |
| SELECT | ⬆️ 빨라짐 |
| INSERT | ⬇️ 느려짐 |
| UPDATE | ⬇️ 느려짐 |
| DELETE | ⬇️ 느려짐 |
👉 인덱스가 많을수록 DML 시 인덱스도 함께 갱신해야 함
7. 인덱스 설계 시 주의사항
무조건 만들면 안 됨 ❗
- 데이터 건수가 매우 적은 테이블 ❌
- 자주 변경되는 컬럼 ❌
- 중복도가 높은 컬럼 ❌
✔️ 이런 경우에 추천
- WHERE / JOIN / ORDER BY 자주 사용
- 검색 조건에 자주 등장
- PK / FK 컬럼
마무리
인덱스는 오라클 성능 튜닝의 시작이자 핵심이다. 하지만 무조건 만드는 것이 아니라, 왜 필요한지 이해하고 설계하는 것이 중요한 것 같다. SELECT쿼리에서 인덱스를 사용하게 될 텐데 이번 글을 보고 이해하면 좋을 것 같다. 아직 튜닝에 대해서 어렵게 생각하지만 언젠가 한번 쿼리 튜닝에 대해 작성해볼까 한다. 감사합니다. (_ _)
'오라클' 카테고리의 다른 글
| [오라클] EXISTS와 IN 함수 차이 비교 완벽 정리 (0) | 2026.01.08 |
|---|---|
| [오라클] WHERE 절과 HAVING 절의 차이 (0) | 2026.01.07 |
| [오라클] 트랜잭션(Transaction) COMMIT / ROLLBACK 완벽 정리 (0) | 2026.01.05 |
| [오라클] INSERT 문법 완벽 정리 (예제+주의 사항) (0) | 2026.01.03 |
| [오라클] DELETE 문법 완벽 정리 (예제 + 주의 사항) (0) | 2026.01.02 |