인덱스를 정상적으로 사용한다.
- 인덱스 컬럼을 가공하지 않아야 인덱스를 정상적으로 사용할 수 있다.
- Index Range Scan : 리프 블록에서 스캔 시작점을 찾아 거기부터 스캔하다가 중간에 멈추는 것
- 인덱스 컬럼을 가공해도 사용할 수 있지만, 스캔 시작점을 찾을 수 없고 멈출수도 없으므로 리프 블록 전체를 스캔해야한다 ⇒ Index Full Scan
"인덱스 컬럼을 가공하면 인덱스를 정상적으로 사용 (Range Scan)할 수 없다."
인덱스 컬럼을 가공 = 좌변 가공
- 인덱스 컬럼을 가공하면 인덱스 스캔 시작점을 찾을 수 없다
- LIKE로 중간 값 검색하는 경우
- OR 조건으로 검색하는 경우
- IN 조건으로 검색하는 경우
⇒ UNION ALL방식으로 작성하면, 각 브랜치 별로 인덱스 스캔 시작점을 찾을수 있다
IN 조건절의 경우 IN-List개수만큼 Index Range Scan을 반복한다
where substr(생년월일, 5, 2) = '105'
where nvl(주문수량, 0) < 100
where 업체명 like '%대한%'
where (전화번호 =: tel OR 고객명 =: cust_nm)
where 전화번호 in (:tel_no1, :tel_no2)
인덱스 사용 조건
- 인덱스 선두 컬럼이 조건절에 있어야 한다
- 인덱스 선두 컬럼이 가공되지 않은 상태로 조건절에 있으면 인덱스 Range Scan은 무조건 가능
but, Range Scan을 한다고 해서 항상 성능이 좋은것은 아니다.
인덱스를 이용한 소트 연산 생략
ex) PK 인덱스 : 장비번호 + 변경일자 + 변경순번
-
PK 인덱스를 사용하고 모두 = 조건으로 검색하는 경우 옵티마이저는 SQL에 ORDER BY가 없어도 정렬 연산을 따로 수행하지 않는다.
⇒ PK 인덱스를 스캔하면서 인덱스 구성 마지막 컬럼 순으로 정렬되기 때문
-
만약 정렬 연산을 생략할 수 있게 인덱스가 구성되어 있지 않다면, 실행계획에 SORT(ORDER BY)연산이 추가된다.
-
정렬
- ASC인 경우 : 조건을 만족하는 가장 작은 값을 찾아, 좌측으로 수직적 탐색 후 우측으로 수평적 탐색
- DESC인 경우 : 조건을 만족하는 가장 큰 값을 찾아, 우측으로 수직적 탐색 후 좌측으로 수평적 탐색 ( Index Range Scan Descending )