튜닝중급

Index Range Scan

인덱스에서 조건에 맞는 범위만 효율적으로 읽는 데이터 접근 방식

정의

B-tree 인덱스의 리프 블록을 따라 조건에 맞는 범위를 순차적으로 읽는다. WHERE 조건에 인덱스 컬럼이 있고 결과가 일정 비율 이하일 때 옵티마이저가 선택한다. 인덱스에서 ROWID를 얻은 뒤 TABLE ACCESS BY INDEX ROWID로 테이블 블록을 추가로 읽는 비용이 따라온다.

왜 중요한가?

WHERE 조건인덱스 컬럼이 포함되면 옵티마이저가 Index Range Scan을 선택할 수 있다. 전체 테이블을 읽지 않고 필요한 범위만 읽으므로 대용량 테이블에서 성능이 극적으로 개선된다.

틀리기 쉬운 포인트

  • !복합 인덱스(A, B, C)에서 선두 컬럼(A)이 WHERE 조건에 없으면 Index Range Scan이 불가합니다.
  • !WHERE 조건에 함수를 씌우면 인덱스를 무력화합니다.
  • !Index Range Scan 후 TABLE ACCESS BY INDEX ROWID로 테이블을 다시 읽는 비용이 있습니다. 대량 데이터를 읽으면 오히려 Full Table Scan이 빠를 수 있습니다.

예시

  -- 실행계획에서 INDEX RANGE SCAN이 나타나면 인덱스가 효과적으로 활용된 것

성능 포인트

!인덱스 → 테이블 ROWID 액세스 비용을 잊지 마라. 대량 결과에서는 Full Scan이 더 빠를 수 있다.

관련 개념

관련 문제 풀어보기

관련 카테고리