반응형
Oracle에서 WHERE 조건에 인덱스가 안 타는 이유와 해결법 (실전 예제 포함)
쿼리를 아무리 최적화해도 Oracle에서 WHERE 조건이 인덱스를 타지 않는 경우가 발생합니다.
이 글에서는 인덱스가 무시되는 이유와 그에 대한 실무적인 해결 방법을 예제와 함께 정리합니다.
✅ 인덱스를 타지 않는 주요 원인
- 함수 사용 (ex. UPPER, TO_CHAR, NVL 등)
- 암시적 타입 변환 (컬럼은 숫자인데 문자열 리터럴 비교 등)
- 불필요한 연산 포함 (ex. +0, *1 같은 연산)
- LIKE 앞에 % 포함 (ex. '%abc')
- IS NULL / IS NOT NULL 조건
📌 예제: 인덱스 무시되는 케이스
SELECT * FROM USER_TABLE WHERE TO_CHAR(USER_ID) = '1001';
👉 USER_ID 컬럼이 NUMBER 타입인데, TO_CHAR를 적용하여 인덱스 무시됨
✅ 해결 방법
- 가능한 한 컬럼에 함수를 쓰지 않도록 쿼리 구조 변경
- 문자 vs 숫자 타입 일치시켜 비교
- 함수 사용이 불가피하다면 Function-Based Index (FBI) 생성
📌 Function-Based Index 예시
CREATE INDEX IDX_USER_ID_CHAR ON USER_TABLE(TO_CHAR(USER_ID));
✅ 실행계획으로 확인
쿼리 앞에 아래 명령 추가:
EXPLAIN PLAN FOR SELECT ~~~
→ SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);로 인덱스 사용 여부 확인
🔚 마무리
Oracle에서 인덱스가 타지 않는 이유는 단순 문법 오류가 아닌 함수, 타입 변환, 연산 구조 때문인 경우가 많습니다.
실무에서는 EXPLAIN PLAN 분석 → 쿼리 리팩토링 → 필요시 FBI 생성이 가장 효과적입니다.
🔔 다음 글 예고
[Oracle 인덱스 힌트 사용법과 주의사항]
반응형
'웹개발 > Oracle' 카테고리의 다른 글
| Oracle INDEX 힌트 완벽 가이드 (INDEX, FULL, NO_INDEX 실전 예제 포함)👉 실행계획을 바꾸는 오라클 힌트 사용법 (0) | 2025.07.01 |
|---|---|
| Function-Based Index (FBI)란? Oracle 인덱스 최적화 실전 가이드 (0) | 2025.07.01 |