친절한 SQL 튜닝 - 4일차

DevSeoRex·2022년 9월 29일
0
post-custom-banner

1.3.4 시퀀셜 엑세스 vs 랜덤 엑세스

테이블 또는 인덱스 블록을 액세스하는 방식에는 시퀀셜 엑세스와 랜덤 엑세스
방식이 있다

  • 시퀀셜 엑세스
    논리적 또는 물리적으로 연결된 순서에 따라 차례대로 블록을 읽는 방식
  • 랜덤 엑세스
    논리적, 물리적인 순서를 따르지 않고, 레코드 하나를 읽기 위해 한 블록씩
    접근하는 방식이다.

1.3.5 논리적 I/O vs 물리적 I/O

  • DB 버퍼캐시
    공유메모리 SGA의 구성요소 중 하나이다.
    DB 버퍼캐시는 '데이터 캐시' 라고 할 수 있으며, 디스크에서 어렵게 읽은 데이터 블록을 캐싱해 둠으로써 같은 블록에 대한 반복적인 I/O Call을 줄이는 데 목적이 있다.

오라클 SQL PLUS에서 버퍼캐시 사이즈를 확인하는 방법

논리적 I/O vs 물리적 I/O

SQL을 수행하려면 데이터가 담긴 블록을 읽어야 한다.
SQL이 참조하는 테이블에 데이터를 삽입/삭제하지 않는 상황에서 조건절에 같은 변수 값을 입력한다면, 아무리 여러 번 실행해도 매번 읽는 블록 수는 같다.
SQL을 수행하면서 읽은 총 블록 I/O가 논리적 I/O다.

Direct Path Read 방식으로 읽은 것이 아니라면 모든 블록은 DB 버퍼캐시를 경유해서 읽는다.

버퍼캐시 히트율(BCHR)

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을 의미하는 것은 아니다.

1.3.6 Single Block I/O vs Multiblock I/O

  • 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 방식으로 읽더라도 익스텐트 경계는 넘지 못한다.

출처 : 친절한 SQL 튜닝(디비안, 조시형 저)

post-custom-banner

0개의 댓글