데이터를 저장하는 block을 한번에 여러 개를 access 하는 것이 아닌 한번에 하나의 block만을 access하는 Single Block I/O
방식입니다.
Table Full Scan
: Multi Block I/O 방식이라고 하며, 한번에 여러 개의 block을 access하는 방식입니다.
대표적으로 인덱스를 스캔하여 확인 ROWID
를 통해 테이블에 access하는 경우 Table Random Access가 발생합니다.
WHERE
절, HAVING
절 조건의 특정 컬럼이 인덱스이 아닐 경우 인덱스 스캔을 통해 추출한 ROWID로 테이블의 데이터에 랜덤 액세스 하는 과정을 확인 랜덤 액세스라고 합니다.
예를 들어,
where empno = 10
and ename = 1
라는 2개의 조건이 있고, empno는 인덱스 컬럼, ename는 일반 컬럼이라 한다면
결국 empno 조건을 만족하는 모든 데이터에 대해 테이블 액세스를 통해 ename 조건에 부합하는 값을 찾아야 합니다.
이 경우 인덱스 스캔 후 테이블 랜덤 액세스의 횟수와 일반 컬럼 조건에 필터링된 데이터의 개수에 차이가 발생할 수 있습니다. 일반 컬럼 조건에 맞지 않는 데이터는 버려지기 때문입니다.
select ename
from emp
where empno=10;
WHERE
절의 컬럼들은 모두 인덱스에 존재하지만 SELECT
절의 컬럼이 인덱스에 존재하지 않을 때 where
절 인덱스 스캔 이후 SELECT
와 관련해 테이블에 랜덤 액세스하는 과정이 추출 랜덤 액세스입니다.
이 경우 랜덤 액세스의 횟수와 추출된 데이터의 개수는 같습니다.
select empno, ename
from emp
where empno=10
order by 2;
SELECT
이후 ORDER BY
절에 사용된 컬럼이 인덱스 컬럼이 아닌 경우 테이블에 액세스 해서 정렬에 필요한 데이터에 랜덤 액세스하게 되는데 이 과정을 정렬 랜덤 액세스라고 합니다.
이 경우 랜덤 액세스의 횟수와 추출된 데이터의 개수는 같습니다.
추출 랜덤 액세스와 정렬 랜덤 액세스는 랜덤 액세스 횟수와 추출되는 건수가 동일하지만
확인 랜덤 액세스는 추출되는 데이터의 건수가 감소할 수 있고 랜덤 액세스 중 가장 많은 부하를 발생시킵니다.
따라서 SQL 튜닝은 최우선적으로 확인 랜덤 액세스를 제거하기 위해 노력해야 합니다.
참고