1. Index Range Scan
- 가장 일반적인 인덱스 스캔
- root block -> leaf block을 수직적으로 탐색한 후에 필요한 leak 블럭만 스캔
- 스캔 범위, 즉 Range를 얼마나 줄일 수 있느냐에 따라 성능이 좌우됨
- 인덱스 선두 컬럼이 조건절에 사용되어야 함
- 결과는 인덱스 컬럼 순으로 정렬된 상태이다. 따라서 order by를 생략할 수 있으며 min/max 추출에 유리하다.
2. Index Range Scan Descending
- Index Range Scan과 동일
3. Index Full Scan
- 일단 수직적 탐색을 한다. 이는 단지 가장 좌측의 leak block을 찾기 위해서다.
- 일단 가장 좌측의 leak block을 찾고 나면, 인덱스 leaf block을 처음부터 끝까지 수평적으로 스캔한다.
- 인덱스 선두 컬럼이 조건절에 없다면 Full Scan이 고려되는데, 만약 일부에 대해서 필터하고 나머지에 대해서만 Full Scan을 할 수 있다면 이 Index Full Scan이 사용된다.
4. Index Fast Full Scan
- Index Full Scan보다 빠른 이유는 인덱스 구조를 무시하고 인덱스 segment 전체를 multiblock read하기 때문
5. Index Unique Scan
- = 조건을 사용하는 경우
- 단, = 가 아닌 BETWEEN 조건이 들어오면 Index Range Scan 동작 (Unique 인덱스를 사용하더라도 Index Range Scan)
-
Unique 결합 인덱스를 사용하는 경우, 만약 조건절에 모든 인덱스 컬럼을 다 사용하지 않으면 Index Range Scan 동작, 왜냐하면 추출 데이터가 단 1건이라는 보장이 없기 때문이다.
-
Unique 인덱스는 말 그대로 중복 값이 없다. 따라서 수직적 탐색만을 수행한다.
6. Index Skip Scan
- 9i부터 가능
- 인덱스 선두 컬럼이 조건절에 빠진 경우, 그리고 선두 컬럼의 distinct 수가 적고, 후행 컬럼의 distinct 수가 많을 때 유용한다.
- 어쨌든 Full Scan 보다 I/O가 적다고 판단되어야 동작한다.
인덱스 스캔을 하지 않는 경우..
- 인덱스드 컬럼에 변형이 가해지는 경우 (예: 함수가 씌어진다던지, 숫자형의 경우 연산이 발생한다던지)
- NULL 혹은 NOT NULL과 비교를 한다.
- NOT 비교를 한다.
- CBO의 실행 계획에 의해 선택되는 경우.
플랜 테이블 생성 방법...
$ORACLE_HOME/rdbms/admin/utlxplan.sql을 실행한다.
실행 계획...
EXPLAIN PLAN FOR [SQL문]