Index를 사용할 수 없는 조건인가요?? 0 2 1,178

by 맑이 [Oracle 기초] Index [2020.01.03 15:10:27]


Index1 : EMP_ID

Index2 : DEP_NAME

 

위와 같이 두개의 컬럼에 Index가 생성되어 있을 때, 아래의 WHERE절의 경우 Index가 불가한지 질문드립니다.

(테이블 정보없이 WHERE절 조건만으로 판별이 가능할지는 모르겠네요..)

 

1. ~~~ WHERE (EMP_ID > :var1 OR EMP_ID < :var2) AND DEP_NAME != :var3

2. ~~~ WHERE (DEP_NAME = :var1 OR DEP_NAME = :var2) AND DEP_NAME IS NOT NULL

 

by 마농 [2020.01.03 16:02:53]

1번은
 - dep_name 은 부정 조건이라 인덱스를 타기 어렵고,
 - emp_id 는 범위 조건에 OR 조건이라 인덱스를 타기 어렵네요.
 - 비효율적이긴 하지만 억지로 힌트 주고 인덱스 타게 한다면 가능할 수 있습니다.
 - 다만, 인덱스 범위스캔은 불가능하고 인덱스 풀스캔 정도는 가능합니다.
2번은
 - 이퀄 조건 두개 OR 네요. 이는 IN 조건과 같은 조건이고 인덱스 스캔 가능합니다. dep_name IN (:var1, :var2)
 - IS NOT NULL 조건은 굳이 필요 없는 조건이지만, 인덱스 스캔을 유도하는 조건으로 사용되기도 합니다.


by 맑이 [2020.01.05 19:14:04]

결과적으로 1번은 부정조건이고, 범위+OR조건이라서 인덱스가 타기 어렵운 것이군요..

답변 감사합니다!!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입