테이블 또는 인덱스 블록을 액세스하는 방식에는 시퀀셜 엑세스와 랜덤 엑세스
방식이 있다
오라클 SQL PLUS에서 버퍼캐시 사이즈를 확인하는 방법
SQL을 수행하려면 데이터가 담긴 블록을 읽어야 한다.
SQL이 참조하는 테이블에 데이터를 삽입/삭제하지 않는 상황에서 조건절에 같은 변수 값을 입력한다면, 아무리 여러 번 실행해도 매번 읽는 블록 수는 같다.
SQL을 수행하면서 읽은 총 블록 I/O가 논리적 I/O다.
Direct Path Read 방식으로 읽은 것이 아니라면 모든 블록은 DB 버퍼캐시를 경유해서 읽는다.
BCHR을 구하는 공식은 다음과 같다.
BCHR
= (캐시에서 곧바로 찾은 블록 수 / 총 읽은 블록 수) X 100
= ((논리적 I/O - 물리적 I/O) / 논리적 I/O) X 100
= ( 1 - (물리적 I/O) / (논리적 I/O)) X 100
BCHR은 읽은 전체 블록 중에서 물리적인 디스크 I/O를 수반하지 않고
곧바로 메모리에서 찾은 비율을 나타낸다.
실제 SQL 성능을 향상하려면 물리적 I/O가 아닌 논리적 I/O를 줄여야 한다.
논리적 I/O는 항상 일정하게 발생하지만, SQL 튜닝을 통해 줄일 수 있는 통제 가능한
내생 변수이기 때문이다.
BCHR이 SQL 성능을 좌우하지만, BCHR이 높다고 해서 효율적인 SQL을 의미하는 것은 아니다.
Single Block I/O
한 번에 한 블록식 요청해서 메모리에 적재하는 방식
Multiblock I/O
한 번에 여러 블록씩 요청해서 메모르에 적재하는 방식
인덱스를 이용할때는 소량데이터를 읽는 경우가 많으므로, Single Block I/O 방식이 효율적이다.
많은 데이터 블록을 읽을때는 Multinlock I/O 방식이 효율적이다.
테이블 전체를 스캔할 때 이 방식을 사용한다.
읽고자 하는 블록을 DB 버퍼캐시에서 찾지 못하면 해당 블록을 디스크에서 읽기 위해서 I/O 콜을 한다. 그동안 프로세스는 대기 큐(Wait Queue)에서 잠을 잔다.
대용량 테이블을 Full Scan 할 때 기왕이면 한꺼번에 많은 양을 요청해야 잠자는 횟수도 줄이고 성능이 올라가기 때문에 Multiblock I/O 방식을 사용한다.
OS마다 다르지만 DBMS는 블록 사이즈가 얼마건 간에 보통 1MB 단위로 I/O를 수행한다.
오라클에서 손수레에 한 번에 담는 양은 db_file_multiblock_read_count 파라미터로 정한다.
show paramter db_file_multiblock_read_count;
명령어로 확인할 수 있다.
인접한 블록이란 같은 익스텐트에 속한 블록을 의미하는데, Multiblock I/O 방식으로 읽더라도 익스텐트 경계는 넘지 못한다.