본문 바로가기

SQL/친절한 sql 튜닝

[1주차]

사전 이해에 도움되는 것

 

 

 

 

1.3.4 시퀀셜 액세스 vs. 랜덤 액세스

테이블 또는 인덱스 블록을 액세스하는(=읽는) 방식

시퀀셜 액세스 랜덤 액세스
논리적, 물리적 연결된 순서
차례대로 목록을 읽는다
순차적으로 스캔한다
실선 화살표
논리적, 물리적 순서를 따르지 않는다
레코드 하나를 읽기위해 한 블록씩 접근한다.
점선 화살표

테이블 또는 인덱스 블록을 액세스하는(=읽는) 방식으로는

시퀀셜 액세스와 랜덤 액세스, 두가지가 있다.

 

첫째, 시퀀셜(Sequential) 액세스는 논리적 또는 물리적으로 연결된 순서에 따라 차례대로 블록을 읽는 방식이다. 

둘째, 랜덤(Random) 액세스는 논리적, 물리적인 순서를 따르지 않고, 레코드 하나를 읽기 위해 한 블록씩 접근(=touch)하는 방식이다.

 

 

 

 

 

 

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

 

DB 버퍼캐시

데이터를 캐싱하는 ‘DB 버퍼캐시’도 System Global Area 의 가장 중요한 구성요소 중 하나다.

DB 버퍼캐시 라이브러리 캐시
데이터 캐시
디스크에서 어렵게 읽는 데이터 블록을 캐싱해 둠으로써 같은 블록에 대한 반복적인 I/O Call을 줄이는 데 목적
QL과 실행계획, DB 저장형 함수/프로시저 등을 캐싱하는 ‘코드 캐시’

버퍼 캐시 사이즈 확인

show sga

 

 

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

 

 

논리적 블록 I/O 물리적 블록 I/O
SQL문을 처리하는 과정에 메모리 버퍼캐시에서 발생한 총 블록 I/O를 말한다.

전기 신호
디스크에서 발생한 총 블록 I/O를 말한다.

물리 작용 발생
고정된 값
바퀴를 7500번 회전 시켜야 갈 수 있는 거리

변하는 값
페달을 750번 밟아야 갈 수 있는 거리
환경에 따라 매번 달라진다
고정된 값
아무리 여러번 실행해도
매번 읽는 블록의 수는 같다
모든 블록은 DB 버퍼캐시를 경유해서 읽는다.

논리적 블록 I/O 횟수== DB 버퍼캐시에 읽은 횟수
DB버퍼캐시에서 블록을 찾지 못해
디스크에서 읽은 블록I/O
sql을 실행할 떄마다 다르다.
실행하면 할 수록 줄어든다.
왜냐면 연속해서 실행시-> DB 버퍼캐시에
해당 블록 점유율이 높아지 때문이다

 

 

 

 

버퍼캐시 히트율

버퍼캐시 효율을 측정하는 데 전통적으로 가장 많이 사용해 온 지표는

버퍼캐시 히트율(Buffer Cache Hit Ratio, 이하 ‘BCHR’)이다. 

BCHR메모리에서 찾은 비율을 나타낸다.

BCHR = ( 캐시에서 곧바로 찾은 블록 수 / 총 읽은 블록 수 ) * 100
         = ( (논리적 I/O – 물리적 I/O) / 논리적 I/O) * 100
         = ( 1 – (물리적 I/O) / (논리적 I/O) ) * 100

논리적 I/O는 일정하다
BCHR도 일정하다
따라서 논리적 I/O 를 줄이면 물리적 I/O는 줄어든다.

어떻게 논리적 I/O 를 줄이는가?
총 블록 개수를 줄이면 된다.
논리적 I/O 물리적 I/O
통제 가능한 내생 변수 통제 불가능한 변수
   
Query + Current Disk

 

 

 

논리적 I/O를 줄임으로써 물리적 I/O를 줄이는 것이 곧 SQL 튜닝이다.

 

 

 

 

 

 

 

 

 

 

 

 

1.3.6 Single Block I/O vs. Multiblock I/O

캐시에서 찾지 못한 데이터 블록은 I/O Call을 통해 디스크에서 DB 버퍼캐시로 적재하고서 읽는다.

I/O Call 할 때, 한 번에 한 블록씩 요청하기도 하고, 여러 블록씩 요청하기도 한다

 

Single Block I/O, Multiblock I/O 요청해서 DB 버퍼캐시로 적재

 

 

Single Block I/O Multiblock I/O
  캐시에서 찾지 못한 특정 블록을 읽으려고
I/O call을 할때 그 블록과 인접한 블록들을 한꺼번에 읽어
캐시에 적재한다.

블록한개(8KB) * 128개 = 1MB 가 최대 담을 수 있다.
 한번에 한 블록씩 요청해서 메모리에 적재하는 방식 여러 블록씩 요청해서 메모리에 적재하는 방식
기본적으로 인덱스와 테이블 블록 모두
Single Block I/O 방식을 사용
많은 데이터를 블록을 읽을 때는 Multiblock I/O 방식이 효율적
인덱스는 소량 데이터를 읽을 때 주로 사용하므로
Single Block I/O 방식이 효율적
인덱스를 이용하지 않고 테이블 전체를 스캔할 때
Multiblock I/O을 사용
1,2,3
데이터 블록 하나하나
4,5,6,7
가로로 데이터 한 뭉텅이
  테이블이 클 수록
Multiblock I/O 의 단위가 크면 좋다
이유는 프로세스가 잠을 자는 횟수를 줄여준다.
데이터가 많이 올때까지 기다리지 않고 
한꺼번에 온 데이터를 처리하면 
프로세서는 잠을 잘 수가 없다

 

 

오라클: 프로세스한테 가져다주는 데이터의 갯수 확인 명령어, 개수 수정

show parameter db_file_multiblock_read_count

alter session set db_file_multiblock_read_count =128;

 

 

 

 

 

Multiblock I/O 중간에 Single Block I/O이 왜 나타나는가?

 

'SQL > 친절한 sql 튜닝' 카테고리의 다른 글

[5주차] 소트 머지 조인  (0) 2022.04.17
[4주차] 인덱스 튜닝  (0) 2022.04.10
[3주차] 테이블 액세스 최소화  (0) 2022.04.03
인덱스  (0) 2022.03.28
[2주차] 인덱스 2.1  (0) 2022.03.27