본문으로 건너뛰기
SQLD 준비실
이론 전체 목차 열기 24 / 32

SQL 고급활용 및 튜닝 · 인덱스 24 / 32

인덱스 튜닝

인덱스가 빠른 이유, 언제 도움이 되고 언제 방해가 되는지, 결합 인덱스의 선두 컬럼 원칙을 정리합니다.

출제 빈도 ★★★★ 관련 문제 4개 | 선두 컬럼INDEX RANGE SCANUnique Index

인덱스는 책의 찾아보기다

인덱스는 테이블 전체를 처음부터 끝까지 읽지 않고 원하는 행의 위치를 빠르게 찾기 위한 구조입니다. 조건에 맞는 행이 적을수록 효과가 큽니다.

SELECT *
FROM emp
WHERE empno = 7788;

empno가 기본키라면 인덱스로 한 명의 사원을 빠르게 찾을 수 있습니다.

인덱스가 유리한 경우

  • 조건 결과가 전체 데이터 중 적은 비율일 때
  • 조인 컬럼으로 자주 사용될 때
  • 정렬이나 그룹화 순서와 잘 맞을 때
  • WHERE 조건에 자주 등장하고 선택도가 높을 때

선택도는 쉽게 말해 “얼마나 적게 걸러지는가”입니다. 성별처럼 값 종류가 적은 컬럼은 단독 인덱스 효과가 약할 수 있습니다. 반대로 사원번호나 주문번호처럼 대부분 유일한 값은 선택도가 높습니다.

인덱스가 불리한 경우

  • 결과가 테이블 대부분일 때
  • INSERT, UPDATE, DELETE가 매우 잦을 때
  • 조건 컬럼을 함수로 감싸 인덱스를 못 쓰게 만들 때
  • 결합 인덱스의 선두 컬럼을 조건에 사용하지 않을 때
WHERE TO_CHAR(order_date, 'YYYYMMDD') = '20260422'

이런 조건은 컬럼을 함수로 변환하므로 일반 인덱스 사용이 어려울 수 있습니다. 가능하면 컬럼 자체는 그대로 두고 범위 조건으로 바꿉니다.

WHERE order_date >= DATE '2026-04-22'
  AND order_date < DATE '2026-04-23'

결합 인덱스

결합 인덱스는 여러 컬럼을 묶은 인덱스입니다.

인덱스: (deptno, job, sal)

이 인덱스는 deptno 조건이 있을 때 효과가 큽니다. 선두 컬럼인 deptno 없이 job만 조건으로 쓰면 인덱스를 충분히 활용하기 어렵습니다.

조건활용 감각
deptno = 10선두 컬럼 사용
deptno = 10 AND job = 'CLERK'앞에서부터 연속 사용
job = 'CLERK'선두 컬럼 누락
deptno = 10 AND sal > 1000중간 컬럼 누락으로 활용 범위 제한

인덱스 스캔의 기본 유형

방식의미
Unique Scan유일한 값을 찾는 접근
Range Scan범위 조건으로 일부 구간을 읽는 접근
Full Scan인덱스 전체를 읽는 접근
Fast Full Scan인덱스를 테이블처럼 빠르게 전체 읽기

튜닝 판단 순서

  1. 조건 결과가 충분히 적은지 확인합니다.
  2. 조건 컬럼에 적절한 인덱스가 있는지 봅니다.
  3. 함수나 형 변환 때문에 인덱스 사용이 막히지 않았는지 확인합니다.
  4. 결합 인덱스라면 선두 컬럼부터 사용되는지 봅니다.
  5. 인덱스 추가가 쓰기 성능과 저장 공간에 주는 비용을 고려합니다.

한 문장 요약

인덱스는 적은 행을 빨리 찾을 때 강하고, 많은 행을 읽을 때는 오히려 돌아가는 길이 될 수 있습니다.