인덱스 튜닝
인덱스가 빠른 이유, 언제 도움이 되고 언제 방해가 되는지, 결합 인덱스의 선두 컬럼 원칙을 정리합니다.
출제 빈도 ★★★★☆ 관련 문제 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 | 인덱스를 테이블처럼 빠르게 전체 읽기 |
튜닝 판단 순서
- 조건 결과가 충분히 적은지 확인합니다.
- 조건 컬럼에 적절한 인덱스가 있는지 봅니다.
- 함수나 형 변환 때문에 인덱스 사용이 막히지 않았는지 확인합니다.
- 결합 인덱스라면 선두 컬럼부터 사용되는지 봅니다.
- 인덱스 추가가 쓰기 성능과 저장 공간에 주는 비용을 고려합니다.
한 문장 요약
인덱스는 적은 행을 빨리 찾을 때 강하고, 많은 행을 읽을 때는 오히려 돌아가는 길이 될 수 있습니다.