← 질문 목록
#5깊이 0

인덱스를 만들었는데 실행 계획에서 타지 않는 이유는?

데이터베이스심화인덱스·질의

인덱스가 있어도 옵티마이저쓸 수 없거나 쓰지 않는 편이 낫다고 판단한 것이다. 두 경우는 원인이 다르다.

갈래실행 계획에서대표 원인
쓸 수 없다후보에도 안 오른다컬럼에 함수 적용, 암묵 타입 변환, 선행 컬럼 누락
쓰지 않는다후보엔 있는데 안 고른다조회 비율이 높다, 통계가 낡았다

쓸 수 없는 경우가 먼저다. 인덱스 컬럼에 함수나 연산을 적용하면 인덱스는 무력해진다. 저장된 값과 비교 대상이 달라지기 때문이다. 타입이 암묵적으로 변환되는 경우도 같다. 복합 인덱스에서 선행 컬럼을 조건에 넣지 않은 경우도 여기 속한다.

쓰지 않기로 한 경우는 통계 문제다. 조회 대상이 전체의 상당 비율이면 인덱스로 한 건씩 찾아가는 것보다 풀 스캔이 빠르다. 옵티마이저는 카디널리티 추정으로 이를 판단하는데, 통계가 오래되면 추정이 틀린다.

핵심 정리

진단 순서가 있다. 실행 계획을 먼저 보고 인덱스가 후보에 올랐는지 확인한다. 후보에도 없으면 쓸 수 없는 경우이고, 후보에 있는데 선택되지 않았으면 통계나 비용 추정 문제다.

날짜 컬럼에 포맷 함수를 씌운 조건이 대표적이다. 조건을 범위 비교로 바꾸면 인덱스가 다시 살아난다.

추천 꼬리질문

0/300

적은 내용은 AI 학습에 쓰일 수 있습니다. 이름이나 연락처는 넣지 말아 주세요.

관련 질문

인덱스를 만들었는데 실행 계획에서 타지 않는 이유는?