본문 바로가기

ORACLE

[ORACLE] 오라클 Table Full Scan VS Index Range Scan

테이블의 데이터를 읽는 방식으로는 크게 2가지로 나뉜다.  

  • Full Table Scan : 테이블 전체를 스캔해서 읽는 방식
  • Index Range Scan : 인덱스를 이용해서 읽는 방식

 

Full Table Scan 이란 ?

  • 시퀀셜 액세스와 Multiblock I/O 방식으로 디스크 블록을 읽는다.
  • 한 블록에 속한 모든 레코드를 한 번에 읽어 들이고, 캐시에서 못 찾으면 '한 번의 수면(I/O Call)을 통해 인접한 수십~수백 개의 블록을 한꺼번에 I/O하는 메커니즘이다.
  • 이 방식을 사용하는 SQL 은 스토리지 스캔 성능이 좋아지는 만큼 성능도 좋아진다.

BUT 시퀀셜 액세스와 multiblock i/o 가 아무리 좋아도

수십~수백 건의 "소량" 데이터를 찾을 때 수백만~수천만 건 데이터를 스캔하는 것은 비효율적이다.

그래서 큰 테이블에서 소량 데이터를 검색할 때는 반드시 인덱스를 이용해야 한다.

 

 

Index Range Scan 이란 ?

  • 랜덤 액세스와 Single Block I/O 방식으로 디스크 블록을 읽는다.
  • 캐시에서 블록을 못 찾으면, '레코드 하나를 읽기 위해 매번 잠을 자는 I/O 메커니즘이다.
  • 많은 데이터를 읽을 때는 Table Full Scan 보다 불리하다.
  • 열심히 일해야 할 프로세스가 대기 큐에 들어가서 잠을 자버려서 스캔 성능이 안나온다.
  • 읽었던 블록을 반복해서 읽는 비효율이 있다.
  • 한 블록에 평균 500개의 레코드가 있다면 같은 블록을 최대 500번 읽을 수 있다는 것이다.
  • 인덱스를 이용해서 '전체 레코드' 500개를 액세스한다면 각 블록을 단 한번만 읽는 table full scan 보다 훨씬 성능이 떨어진다.

SO 읽을 데이터가 일정량을 넘으면 인덱스보다 Table Full scan 이 유리하다.

 

 

총 정리 

대용량 데이터 중에서 극히 일부의 데이터를 찾을 때,

인덱스 스캔 방식(Index Scan)은 인덱스를 이용해 몇 번의 I/O만으로 원하는 데이터를 쉽게 찾을 수 있다.

그러나 전체 테이블 스캔 (Full Table Scan)은 테이블의 모든 데이터를 읽으면서

원하는 데이터를 찾아야하기 때문에 비효율적인 검색을 하게 된다. 

 

그러나 반대로 테이블의 대부분의 데이터를 찾을 때는 한 블록씩 읽는 인덱스 스캔 방식보다는

어차피 대부분의 데이터를 읽을 거라면 한번에 여러 블록 씩 읽는 전체 테이블 스캔방식이 유리할 수 있다.

 

 


Reference

https://genote.tistory.com/m/47

https://hoon93.tistory.com/53

 

'ORACLE' 카테고리의 다른 글