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문]