[1] Multiblock I/O 예시
=================================================================
call count cpu elapsed disk query current rows
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.26 0.26 64 69 0 1
total 4 0.26 0.26 64 69 0 1
=================================================================
위 Call 통계 결과
- 버퍼 캐시에서 69개 블록을 읽으면서 64개는 디스크에서 읽었다.
- 버퍼 캐시 히트율은 7.24%이다.
- 디스크에서 읽은 블록 수가 64개라고 I/O Call도 동일하지는 않다. 동일하거나 그보다 작을 수도 있다.
[2] I/O Call을 통해 데이터파일에서 버퍼 캐시에 적재하는 방식
(1) Single Block I/O
- 한번의 I/O Call에 하나의 데이터 블록만 읽어 메모리에 적재하는 것이다.
- ⭐️인덱스를 통해 테이블을 액세스할 때 ,기본적으로 인덱스와 테이블 블록 모두 이 방식을 사용한다.⭐️
- 인덱스 블록간 논리적 순서
- 인덱스 리프 블록끼리 이중 연결 리스트(Double Linked List) 구조로 연결된 순서이다.
- 물리적으로 데이터파일에 저장된 순서와 다르다.
- 물리적으로 한 Extent에 속한 블록들을 I/O Call 발생 시점에 같이 적재하여 올렸을 때, 그 블록들이 논리적 순서로는 한참 뒤쪽에 위치할 수 있으므로, 실제 사용되지 못한 채 버퍼상에서 밀려 날 수도 있으므로 Singl Block I/O방식이 효율적이다.
- Index Range Scan 뿐 아니라 ⭐️Index Full Scan시에도 논리적인 순서에 따라 Single Block I/O방식으로 읽는다.⭐️
- ⭐️Index Fast Full Scan은 Multiblock I/O 방식을 사용한다.⭐️
(2) Multiblock I/O
- I/O Call이 필요한 시점에 인접한 블록들을 같이 읽어 메모리에 적재하는 것이다.
- Full Scan과 같이 저장된 순서에 따라 읽을 때는 그릇(한번 I/O에 1MB의 '그릇'을 사용)이 허용하는 범위 내에서 인접한 블락을 읽는 것이 유리하다.
- 인접한 블락은 한 익스텐트 범위 내의 블락을 말한다.
- ⭐️즉, Multiblock I/O을 하더라도 한 익스텐트 범위를 넘지 못한다.⭐️
- Multiblock I/O 단위는 db_file_muliblock_read_count 파라미터에 의해 결정된다.
- Index Fast Full Scan은 Multiblock I/O 방식을 사용한다.
[3] I/O 요청시 대기 이벤트 종류
- 서버 프로세스는 Disk에서 블록을 읽어야 하는 시점마다 I/O 서브시스템에 I/O 요청을 하고 대기 상태에 빠진다.
(1) db file sequential read
- Single Block I/O방식으로 I/O를 요청할 때 발생한다.
- Singl Block I/O방식으로 읽은 블록들은 LRU 리스트 상 MRU쪽 end로 연결되므로 한번 적재되면 버퍼 캐시에 비교적 오래 머문다.
(2) db file scattered read
- Multiblock I/O방식으로 I/O를 요청할 때 발생한다.
- Multiblock I/O방식으로 읽은 블록들은 LRU 리스트에서 LRU쪽 end로 연결되므로 적재되고 얼마 지나지 않아 버퍼캐시에서 밀려난다.