Prefetch

- 디스크 블록을 읽을 때 곧이어 읽을 가능성이 높은 블록을 미리 읽어오는 기능

- 한번에 여러개 Single Block I/O를 병렬 방식으로 동시 수행

* Multi Block I/O가 한 익스텐트에 속한 인접한 블록들을 한꺼번에 읽는 방식이라면 Prefetch는 멀리 떨어져있는 블록들을 한꺼번에 읽는 방식 (서로 다른 익스텐트에 위치한 블록을 배치 방식으로 미리 적재)

* db file parallel read 대기 이벤트로 측정

Sequential 액세스 성능 향상 
- Multiblock I/O, 인덱스 Prefetch

Random 액세스 성능 향상 
- 버퍼 Pinning, 테이블 Prefetch


인덱스 Prefetch

- Branch Block에서 앞으로 읽게 될 Leaf Block 주소를 미리 얻을 수 있으므로 Disk I/O Call이 필요한 시점에 미리 캐싱

- ①②③④ 순으로 Index Range Scan을 한다면 2번 Branch Block을 읽고 5번 Leaf Block을 읽을 때 6,7번을 미리 적재 (Multiblock 블록 I/O 혼용 가능)

- Index Full Scan의 경우 Leaf Block을 모두 Prefetch 하면 매우 효율적 (단, Blanck Block을 한번만 읽는 일반적인 Index Full Scan과 달리 Leaf Block 바로 위의 Index Branch Block들을 읽어야하는 비효율 발생) 


테이블 Prefetch

- Index와 Table 간 Random Access 시 디스크에서 테이블의 다른 블록까지 미리 캐싱

- ①②③④⑤⑥⑦ 순서로 읽을 경우, 5번을 읽고 13번 읽을 때 13,15,18을 미리 적재

- 인덱스 클러스터링 팩터가 나쁠 때 특히 효율적(클러스터링 팩터가 나쁘면 disk I/O ↑)

- 버퍼 pinning은 논리적 블록 요청 횟수를 감소, 테이블 Prefetch는 Disk I/O에 대한 대기 횟수를 감소


by 정미나 2018.01.05 18:00