ORACLE Tip2008. 11. 14. 10:30

* 인덱스 유일 스캔 (INDEX UNIQUE SCAN)
  - 대부분 단 하나의 ROW를 추출
  - 전체조건을 만족할 경우 옵티마이져는 인덱스 유일 스캔을 선택
    - 인덱스가 기본키 이거나, 유일 인덱스(UNIQUE INDEX)로 구성
    - 인덱스를 구성하는 모든 컬럼들이 모두 조건절에서 '='(EQUAL) 비교
  - 데이터베이스 링크(DATABASE LINK) 사용시 힌트로 적용
  - 힌트는 INDEX(TABLE_ALIAS INDEX_NAME) 힌트 적용
 
* 인덱스 범위 스캔 (INDEX RANGE SCAN)
  - 추출되는 ROW는 INDEX 구성 컬럼의 정렬순서와 동일
  - ORDER BY 절이 있더라도 추가 정렬 작업이 필요없을 수도 있음.
  - NON UNIQUE INDEX, UNIQUE INDEX
    - 하나이상의 인덱스 선행컬럼에 상수나 변수로 조건이 부여되어야 함.
    - 비교연산자는 '=, <, <=, >, >=, BETWEEN, LIKE'등
    - 단, LIKE연산자 사용시 '%ABC'의 경우 범위 스캔 불가
    - COL1+COL2+COL3에서 COL2 조건이 없는 경우
  - 힌트는 INDEX(TABLE_ALIAS INDEX_NAME) 힌트 적용

* 인덱스 역순 범위 스캔 (INDEX RANGE SCAN DESCENDING)
  - 인덱스를 역순으로 스캔
  - 기타 사항에 대하여는 인덱스 범위 스캔과 동일
    - 가장 최근에 발생한 내용을 처리하기 위한 경우 사용
    - 부분범위 처리 (Partial Range)를 위해 사용
    - ORDER BY .. DESC 시 발생
    - INDEX_DESC(TABLE_ALIAS INDEX_NAME) 힌트 사용시 발생

* 인덱스 스킴 스캔 (INDEX SKIP SCAN)
  - ORACLE 9i 부터 적용
  - Cardinality가 낮은 선형 컬럼 + 높은 후행칼럼으로 구성된 인덱스일수록 큰 효과
  - 내부적으로 선행 컬럼 값의 Distinct Value 만큼의 Logical Sub-Index로 나눠서 SCAN한다.
  - Analyze 되어 있는 오브젝트에 적용된다.     
  - 힌트는 INDEX_SS, INDEX_SS_ASC, INDEX_SS_DESC 가 있다. 
 
* 인덱스 전체 스캔 (INDEX FULL SCAN)
 - 전제조건
  - 조건절에서 인덱스 컬럼에 적어도 하나이상 사용되었을때.
  - 반드시 선행컬럼이 사용될 필요는 없음.
  - 쿼리 내 사용된 어떤 테이블들의 모든 컬럼들이 인덱스에 존재
  - 인덱스 컬럼 중 최소한 NOT NULL인 컬럼이 최소 하나는 존재
  - ORDER BY 절에 사용될 경우 인덱스를 사용하여 SORT가 가능할 때
 - SINGLE BLOCK I/O 수행
 
* 인덱스 고속 전체 스캔 (INDEX FAST FULL SCAN)
 - 인덱스 스캔만을 하며, 테이블 엑세스는 하지 않음.
 - MULTI BLOKC I/O 를 수행
 - BITMAP INDEX에서는 적용 불가
 - 반드시 선행 컬럼이 사용될 필요는 없음
 - 연관된 힌트는 INDEX_FFS, NO_INDEX_FFS 가 있다.

출처 : 새로쓴 대용량 데이터베이스 솔루션 vol.1

Posted by 항아리고미