이번에 다룰 내용은 랜덤 액세스에 대한 내용이다.
아마, 오라클 튜닝에 대해 관심이 있는 사람들이 인덱스와 더불어 가장 처음 접하게 될 내용이고
이해가 가지 않는 내용이라고 생각한다
나 또한 확실하게 개념을 잡기 위해 이렇게 정리한다
랜덤 액세스란?
랜덤 액세스는 데이터를 저장하는 블록을 한 번에 여러 개 액세스 하는 것이 아니라
한 번에 하나의 블록만을 액세스 하는 싱글 블록 I/O 방식이다.
반대로 테이블 풀 스캔(Table Full Scan)의 경우에는 한 번에 여러 개의 블록을 액세스 하는 멀티 블록 I/O 방식을 사용한다.
랜덤 액세스는 언제 발생될까?
인덱스 스캔 시 인덱스의 리프 블록에는 해당 테이블의 행을 가리키는 ROW ID가 존재한다.
위에 보이는 그림의 최하단 영역인 리프 블록 해당 테이블의 행을 가리키는 ROWID 가 보일 것이다.
인덱스 스캔이 완료되면 해당 데이터를 찾아가는 유일한 주소 값인 ROWID를 확인하여 테이블에 액세스 하게 된다.
이러한 일련의 과정들을 랜덤 액세스 또는 테이블 랜덤 액세스라고 한다.
랜덤 액세스의 종류
1. 확인 랜덤 액세스
확인 랜덤 액세스는 WHERE 조건에 의해 발생하게 된다.
예를 들어, WHERE 조건에 계좌번호와 주민등록번호 2개의 조건이 있고 해당 테이블의 인덱스는 계좌번호 칼럼이다.
SQL이 실행되게 되면 계좌번호 칼럼에 의해 인덱스를 액세스하고 처리 범위가 좁혀질 것이다.
그러나, 주민등록번호는 인덱스로 설정이 되어있지 않기 때문에
결국 계좌번호 조건을 만족하는 모든 데이터에 대해 테이블을 액세스 하여 거래일자 조건을 부합하는 값을 찾게 된다.
이처럼 WHERE 조건의 칼럼이 인덱스에 존재하지 않아 테이블 랜덤 액세스를 발생시키는 것을 확인 랜덤 액세스라고 한다.
확인 랜덤 액세스의 특징은 랜덤 액세스의 횟수보다 최종 결과가 동일하거나 더 적게 추출된다는 것이다.
열심히 테이블을 액세스 한 후 버려지는 데이터가 존재하기 때문이다.
그러므로, 랜덤 액세스의 세 가지 종류 중에서도 확인 랜덤 액세스의 제거는 성능에 있어 매우 중요한 역할을 수행하게 된다.
2. 추출 랜덤 액세스
추출 랜덤 액세스는 SELECT 절에서 발생하게 된다.
예를 들어, WHERE 절의 칼럼들은 모두 인덱스에 존재하지만 SELECT 절의 칼럼이 인덱스에 존재하지 않는다면
실행 순서에 의해 인덱스 액세스 이후 테이블을 액세스 해야 한다.
이와 같은 현상이 추출 랜덤 액세스이다.
또한 추출 랜덤 액세스의 경우 SELECT 절의 칼럼들은 추출되는 데이터를 감소시키거나 증가시키지 못하므로
발생한 만큼 결과로 추출된다.
3. 정렬 랜덤 액세스
정렬 랜덤 액세스는 ORDER BY 절 등에 사용된 칼럼이 인덱스에 구성되어 있지 않아 테이블을 액세스 하여
정렬을 수행하기 위해 데이터를 액세스 하는 랜덤 액세스를 발생시키는 경우를 정렬 랜덤 액세스라고 한다
정렬 랜덤 액세스도 추출 랜덤 액세스와 같이 랜덤 액세스의 횟수와 추출되는 데이터 건수가 동일하다
위와 같이 세 가지의 랜덤 액세스 종류를 살펴보았다.
추출, 정렬 랜덤 액세스는 랜덤 액세스의 횟수와 추출되는 건수가 동일하지만
확인 랜덤 액세스는 추출되는 데이터의 건수가 감소할 수 있고 랜덤 액세스 중 가장 많은 부하를 발생시키기 때문에
SQL 튜닝을 하는 입장에서는 최우선적으로 확인 랜덤 액세스를 제거하기 위해 노력해야 할 것이다.