인덱스를 Range Scan 할수 없는 경우
- Range는 범위의 뜻으로 시작점과 끝나는 지점을 찾을수 없는 경우 (수직적 탐색 불가)
- 색인이 정렬되어 있어도 가공한 값이나 중간값(like같은)으로는 스캔 시작점을 못찾음 => 흩어져 있음
=> 즉, 인덱스 컬럼을 가공하지 않아야 인덱스를 정상적으로 사용가능함
sql 예시
- substr(컬럼명, 3, 2) = '85'
- nvl(컬럼명, 0) < 100
- 컬럼명 like %하나%'
- where 컬럼명1 = '45' or 컬럼명2 = '사'
OR Expansion
- OR문의 경우 각각 조건을 나눠서 union all하여 Index Range Scan 가능하다.
- use_concat 힌트로 유도가능
- in 조건절도 동일하게 sql옵티마이저가 IN list iterator방식 사용 => in list 갯수만큼 Index Range스캔
인덱스를 Range Scan 하는 방법
- 인덱스를 정상적으로 사용한다. => 리프블록에서 스캔시작점을 찾아 해당 시점부터 스캔하여 결과를 찾는다.
인덱스가 여러 컬럼으로 조합되어 있는경우
예) A, B, C, D 컬럼으로 구성되어 있을경우 중간값인 C컬럼으로 조회시 인덱스 전체를 스캔해야한다.
따라서 인덱스를 RangeScan 하기 위해서는 인덱스의 선두 컬럼을 조건절로 써야한다.
인덱스 Range Scan을 해서 항상 성능이 좋진 않다.
- 인덱스를 정말 잘 타는지는 인덱스 리프 블록에서 스캔하는 양을 봐야한다.
- 선두 인덱스 컬럼을 사용해도 이 조건이 가공값이라면 효율적이지 않음
'DB > 친절한 SQL 튜닝' 카테고리의 다른 글
| 4. 인덱스 기본 (0) | 2026.01.25 |
|---|---|
| 2. SQL 공유 및 재사용 (0) | 2026.01.18 |
| 1. SQL 파싱과 최적화 (0) | 2026.01.05 |