인덱스 사용

구분인덱스 사용 가능인덱스 사용 불가
범위스캔 불가능
(Index Full Scan은 가능)
1. where절의 왼쪽이 가공 되는 경우 (인덱스 컬럼을 조건절에서 가공)
    ☞ 조건 : FBI인덱스로 정의하지 않음
2. 부정비교 사용
3. is not null 조건 사용 시
조건절에 is null 조건 사용 시
   1) 단일 인덱스와 결합인덱스 공통점
   2) 예외 : 조건에서 사용된 컬럼에 "not null"제약이 있을 경우에는 인덱스 스캔 가능
범위스캔 가능조건절에 is null이외의 조건식이 더 있을 경우
 (전제 : 인덱스 선두 컬럼이 조건절에서 누락 되지 않았을 경우)
   ☞ 인덱스 구성 컬럼 중 하나라도 null값이 아닌 레코드는 인덱스에 저장되기 때문     
(ORACLE : null값을 맨 뒤에 저장)

사례

NO인덱스 컬럼 가공 사례튜닝 방안
1select * from 업체
where substr(업체명,1,2) = '대한'
select * from 업체
where 업체명 like '대한%'
2select * from 사원
where 월급여 * 12 = 36000000
select * from 사원
where 월급여 = 36000000/12
3select * 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)
6select * from 주문
where nvl(주문수량,0) >= 100
주문수량이 100보다 크거나 같을 때 값을 가져오는 경우이므로 주문수량이 null인 경우는 해당 되지 않으므로 "0"으로 치환 할 필요 없음
select * from 주문 where 주문수량 >= 100
7select * 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}

묵시적 형변환

  1. 문자형과 숫자형이 비교 될 때는 숫자형이 우선이 되므로, 문자타입의 컬럼에서 사칙 연산 등의 연산작업이 있으면 묵시적으로 숫자형으로 형변환이 됨
  2. decode(a,b,c,d) : c가 문자형이고 d가 숫자형이면 내부적으로 d가 문자형으로 형변환 됨
  3. 인덱스 컬럼과 비교되는 반대쪽을 인덱스 컬럼 데이터 타입에 맞춤
  4. 참고 : 오라클 메뉴얼