위 세가지는 범위스캔만 불가능하며, index full scan 은 가능
3)의 경우 '부서코드' 단일 컬럼에 인덱스가 존재한다면 인덱스 전체를 스캔하면서 얻은 레코드가 전부 조건을 만족(오라클은 null 값은 인덱스 저장하지 않음)
구분 | 컬럼 가공 | 튜닝 | |
---|---|---|---|
null 은 원래포함 안됨 | select * from 주문 where nvl(주문수량, 0) >= 100 | select * from 주문 where 주문수량 >= 100 | |
null 포함 | select * from 주문 where nvl(주문수량, 0) < 100 | select * from 주문 where 주문수량 < 100 or 주문수량 is null or create index 주문_x01 on 주문 (nvl(주문수량, 0)); | |
PK : 지수구분코드+지수업종코드+거래일자 INDEX : 거래일자 | where 거래일자 between :startDate and :endDate and 지수구분코드 \ | | 지수업종코드 in ('1001', '2003') | IN-List 활용 where 거래일자 between :startDate and :endDate and ( 지수구분코드 , 지수업종코드) in (('1','001'), ('2','003')) |
PK : 수신번호 INDEX : 정정대상접수번호+금감원접수번호 | where decode ( 정정대상접수번호 , lpad(' ', 14), 금감원접수번호,정정대상접수번호) = :접수번호 | decode 조건절 재구성 where 정정대상접수번호 in (:접수번호, lpad(' ', 14)) and 금감원접수번호 = decode( 정정대상접수번호, lpad(' ', 14 ),:접수번호, 금감원접수번호 ) |
|
and y.대상연월(+) = substr(x.파트너지원요청일자,1, 6) - 1
==> and y.대상연월(+) = to_char(add_month(to_date(x.파트너지원요청일자,'yyyymmdd'),- 1), 'yyyymmdd')
묵시적 형변환 사용시 주의사항
(ex) 숫자형(n_col) 과 문자형(v_col) 컬럼 비교시 숫자형으로 변환될때 변화할수 없는 문자열이 있을수있음
where n_col = v_col
where n_col like v_col || '%' => where to_char(n_col) like v_col || '%'
(ex) decode 함수 묵시적 형변환 : decode(a,b,c,d) 에서 데이터타입은 c 가 결정
1) c 문자형 d 숫자형일경우 d 가 문자형으로 변환
2) c 가 null 이면 varchar2 취급
max(decode(job ,'PRESIDENT',NULL, sal)) max_sa12
==> max(decode(job ,'PRESIDENT',to_number(NULL), sal)) max_sa12
함수기반 인덱스(FBI) 활용