본문 바로가기
오라클

[오라클] 인덱스(Index) 완벽 정리

by devlog93 2026. 1. 6.

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쿼리에서 인덱스를 사용하게 될 텐데 이번 글을 보고 이해하면 좋을 것 같다. 아직 튜닝에 대해서 어렵게 생각하지만 언젠가 한번 쿼리 튜닝에 대해 작성해볼까 한다. 감사합니다. (_ _)