인덱스 스캔

Index Full Scan은 인덱스 리프 블록을 처음부터 끝까지 모두 스캔하는 방식이며, 인덱스 선두 컬럼이 조건절에 없을 때 사용된다.

인덱스 선두 컬럼이 조건절에 없으면 Index Range Scan 이 불가능하므로 테이블을 full scan 해야 하는데, 컬럼이 많은 큰 테이블을 스캔하려면 블록 I/O 가 많이 발생하므로 성능이 느리다. 그럴 때 컬럼이 적은 인덱스를 스캔하면 I/O 발생량을 줄일 수 있다.

단, 인덱스 필터 조건을 만족하는 데이터가 적어야 한다. 필터 조건을 만족하는 데이터가 많으면 테이블 랜덤 액세스도 그만큼 많이 발생하므로 테이블 전체 스캔보다 성능이 훨씬 더 느려진다.

필터 조건을 만족하는 데이터가 많더라도 결과집합 중 앞쪽 일부만 스캔하고 멈춘다면

  • = 부분범위 처리를 활용할 수 있다면 Index Full Scan 이 효과적일 수 있다.

인덱스 앞쪽에서 조건을 만족하는 데이터를 빨리 찾을 수 있으므로.

Index Full Scan

Fast Full Scan

Table Full Scan

Table Full Scan / Index Fast Full Scan은 보통 Multiblock I/O로 읽으므로 순서가 보장되지 않을 수 있다.

Unique Scan vs Range Scan

PK(Unique) 인덱스라도

  • 구성 컬럼 전체를 = 조건으로 검색하면 Unique Scan이지만,
  • 일부 컬럼만으로 검색하면 Range Scan이 선택될 수 있다.

Index Skip Scan

(INDEX SKIP SCAN) 전형적인 활용 조건

  • 선두 컬럼의 NDV가 낮고(예: 할인구분코드처럼 값 종류가 적음),
  • 후행 컬럼의 NDV가 높은 경우(예: 상품코드처럼 값이 많음)

선두 컬럼이 범위조건으로 넓게 잡혀 스캔 비효율이 커질 때, INDEX SKIP SCAN이 도움이 되는 경우가 있다. 즉,

  • “선두는 값 종류가 적다”
  • “뒤쪽은 선택도가 높다”
  • “선두 범위를 다 스캔하는 것보다, 선택도 높은 조건 중심으로 ‘필요한 구간만 골라’ 접근할 여지가 있다”

이 조합이 Skip Scan이 잘 먹는 전형적인 패턴이다.