구분 | 인덱스 사용 가능 | 인덱스 사용 불가 |
---|---|---|
범위스캔 불가능 (Index Full Scan은 가능) | 1. where절의 왼쪽이 가공 되는 경우 (인덱스 컬럼을 조건절에서 가공) ☞ 조건 : FBI인덱스로 정의하지 않음 2. 부정비교 사용 3. is not null 조건 사용 시 | 조건절에 is null 조건 사용 시 1) 단일 인덱스와 결합인덱스 공통점 2) 예외 : 조건에서 사용된 컬럼에 "not null"제약이 있을 경우에는 인덱스 스캔 가능 |
범위스캔 가능 | 조건절에 is null이외의 조건식이 더 있을 경우 (전제 : 인덱스 선두 컬럼이 조건절에서 누락 되지 않았을 경우) ☞ 인덱스 구성 컬럼 중 하나라도 null값이 아닌 레코드는 인덱스에 저장되기 때문 (ORACLE : null값을 맨 뒤에 저장) |
NO | 인덱스 컬럼 가공 사례 | 튜닝 방안 | |
---|---|---|---|
1 | select * from 업체 where substr(업체명,1,2) = '대한' | select * from 업체 where 업체명 like '대한%' | |
2 | select * from 사원 where 월급여 * 12 = 36000000 | select * from 사원 where 월급여 = 36000000/12 | |
3 | select * from 주문 where to_char(일시,'yyyymmdd') = :dt | select * from 주문 where 일시 >= to_date(:dt,'yyyymmdd') and 일시 < to_date(:dt,'yyyymmdd') + 1 | |
4 | {code}select * from 고객 where 연령 | 직업 ='30공무원' {code} | select * from 고객 where 연령=30 and 직업 ='공무원' |
5 | {code}select * from 회원사지점 where 회원번호 | 지점번호 = :str {code} | select * from 회원사지점 where 회원번호 = substr(:str,1,2) and 지점번호 = substr(:str,1,2) |
6 | select * from 주문 where nvl(주문수량,0) >= 100 | 주문수량이 100보다 크거나 같을 때 값을 가져오는 경우이므로 주문수량이 null인 경우는 해당 되지 않으므로 "0"으로 치환 할 필요 없음 select * from 주문 where 주문수량 >= 100 | |
7 | select * from 주문 where nvl(주문수량,0) < 100 | ① 1단계 : 주문수량 컬럼이 not null 여부 확인(not null일 경우 : null 치환 함수 제거) ② 2단계 : 해당건수가 많지 않다면 FBI 사용 고려(Table Full Scan이 불가피하므로) | |
8 | 조건절의 컬럼이 가공되어 full table scan을 탐 {code} where 거래일자 between :startDd and :endDd and 지수구분코드 | 지수업종코드 in (('1001'),('2003')) group by 거래일자 {code} | In-List로 처리해서 PK 인덱스를 사용 {code} where 거래일자 between :startDd and :endDd and (지수구분코드, 지수업종코드) in (('1','001'),('2','003')) group by 거래일자{code} |