"오늘의 문제를, 내일의 기록으로 남깁니다."

막연한 이론보다, 구체적인 코드가 필요할 때. 직접 겪고 해결한 문제들을 기록합니다. 실무에서 부딪히는 진짜 이슈와, 내가 이해한 방식 그대로 정리한 가이드입니다.

웹개발/Oracle

Oracle에서 WHERE 조건에 인덱스가 안 타는 이유와 해결법 (실전 예제 포함)

자바를잡아 2025. 7. 1. 21:44
반응형

Oracle에서 WHERE 조건에 인덱스가 안 타는 이유와 해결법 (실전 예제 포함)

쿼리를 아무리 최적화해도 Oracle에서 WHERE 조건이 인덱스를 타지 않는 경우가 발생합니다.
이 글에서는 인덱스가 무시되는 이유와 그에 대한 실무적인 해결 방법을 예제와 함께 정리합니다.

✅ 인덱스를 타지 않는 주요 원인

  1. 함수 사용 (ex. UPPER, TO_CHAR, NVL 등)
  2. 암시적 타입 변환 (컬럼은 숫자인데 문자열 리터럴 비교 등)
  3. 불필요한 연산 포함 (ex. +0, *1 같은 연산)
  4. LIKE 앞에 % 포함 (ex. '%abc')
  5. 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 인덱스 힌트 사용법과 주의사항]

반응형