by-nc-sa     개발자, DBA가 함께 만들어가는 구루비 지식창고!

2. 인덱스 기본 원리




인덱스 사용

구분 인덱스 사용 가능 인덱스 사용 불가
범위스캔 불가능
(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
select * from 고객 where 연령||직업 ='30공무원' 
select * from 고객
where 연령=30 and 직업 ='공무원'
5
select * from 회원사지점 where 회원번호||지점번호 = :str 
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을 탐
 where 거래일자 between :startDd and :endDd 
 and 지수구분코드 || 지수업종코드 in (('1001'),('2003')) 
 group by 거래일자 
In-List로 처리해서 PK 인덱스를 사용
 where 거래일자 between :startDd and :endDd 
 and (지수구분코드, 지수업종코드) in (('1','001'),('2','003')) 
 group by 거래일자

묵시적 형변환

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

문서정보

Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.