인덱스도 엄연히 하나의 객체(object)이다

SQL의 성능을 튜닝하기 위해서 애써 인덱스를 생성하고 인덱스스캔을 수행하게 하였지만

인덱스 구성 컬럼만으로 결과 집합을 도출 할 수 없는 경우 반드시 테이블 랜덤 엑세스가 발생하기 된다

알다시피, 테이블 랜덤 액세스는 DBMS 성능의 큰 장애물이다

그러므로, 이번에는 인덱스라는 객체만을 FULL SCAN하여 원하는 데이터를 가져오는

인덱스 풀 스캔(INDEX FULL SCAN)을 알아보자

 

인덱스 풀 스캔이란?

인덱스 풀 스캔은 오로지 인덱스라는 객체만을 풀 스캔하여 원하는 데이터를 가져오는 것이다

이는 인덱스 튜닝에서 매우 중요한 부분을 차지한다

 

인덱스 풀 스캔의 종류

오라클의 인덱스 풀 스캔은 다음과 같이 두 종류가 있다.

1.인덱스 풀 스캔 (Index Full Scan)

2.인덱스 패스트 풀 스캔 (Index Fast Full Scan)

인덱스 풀 스캔의 두 종류의 특성에 대해 이해하기 전에 먼저 알아야 할 것 이 있다.

그것은 바로 블록단위 I/O이다.

 

블록단위 I/O의 의미와 유형

오라클은 데이터를 가져올 때 항상 블록단위로 가져오게 된다.

예를들어, 단 한건의 행만 가져온다고 해도 해당 행이 속해있는 블록 전체를 가져오게 된다.

이것이 바로 블록단위  I/O이다.

블록단위 I/O의 유형으로는 싱글 블록, 멀티 블록이 있다.

 

싱글 블록 I/O 읽기(Single Block I/O Read)

한번의 읽기를 통해 한 개의 블록을 읽는 방식으로, 일반적인 인덱스 스캔시 사용한다.

예를들어, 사용자가 요청한 데이터 결과를 출력하기 위해 읽어야 하는 블록이 32개라면 32번의 I/O 읽기가 발생한다.

또한, 한번 읽은 블록들은 데이터 버퍼 캐시의 맨 앞쪽에 위치하여 비교적 긴 시간 동안 데이터 버퍼 캐시에 해당 결과가 남게 된다. 그리하여, 데이터 버퍼 캐시에 남아있는 일정시간 동안에는 동일한 SQL문 호출 시 빠른 속도로 사용자에게 데이터를 전달하게 된다.

즉, 자주 수행되는 SQL문에 매우 유리한 블록단위 I/O이다.

 

멀티 블록 I/O 읽기(Multi Block I/O Read)

한번의 읽기를 통해 여러 개의 블록을 읽는 방식으로, 일반적으로 테이블 풀 스캔 시 사용한다.

한번의 읽기로 읽는 블록의 개수가 64개라면 단 한번의 I/O 읽기로 64개의 블록을 모두 읽게 된다.

만약, 효율적인 인덱스 스캔이 아니라면 오히려 테이블 풀 스캔이 성능이 좋을 수 있는 이유가 바로 이 멀티 블록 I/O Read 때문이다.

또한, 싱글 블록과는 다르게 한번 읽은 블록들은 데이터 버퍼 캐시의 맨 뒤쪽에 위치하여 얼마 지나지않아 데이터 버퍼 캐시에서 사라져 동일한 SQL문 호출 시 같은 연산을 반복하게 된다.

즉, 호출 빈도수가 잦은 SQL문에서는 부적합한 방법이 된다. 

 

 

 

 

+ Recent posts