Prefech 란? DBMS는 디스크 블록을 읽을 때 곧이어 읽을 가능성이 있는 높은 블록을 미리 읽어오는 기능
디스크I/O가 비용이 크기 때문에 한번의 I/O Call을 통해 다량의 블록을 퍼 올려 성능향상에 도움을 줌
Prefech는 한번에 여러개 single block IO를 동시에 수행
** 테이블 Prefetch, 인덱스 Prefetch는 인접하지 않을 블록을 서로다른 익스텐트에 위치한 블록을 배치방식으로 적재
- 인덱스 Prefetch : 브랜치 블록에서 앞으로 읽게 될 리프 블록 주소를 미리 얻을 수 있으므로 I/O call이 필요한 시점에 미리 캐싱 해 두는것 . sequential 액세스 성능을 향상 시키려고 Multiblock I/O와 인덱스 Prefech 같은 기능을 사용
인덱스 Prefetch 기능이 가장 효과적일 수 있는 상황은 Index full scan이다. 부분범위처리로 중간에 멈추지 않는다면 모든 인덱스리프블록을 읽게 되기 때문.그러나 Index full scan시 Prefech 방식으로 I/O하려면 리프블록 위쪽 브렌치블록도 추가로 읽어야하므로 Prefech 하지 않을때 보다 I/O가 약간더발생(일반적으로 Index full scan시 가장왼쪽블록만 읽음)
-테이블 Prefetch : 인덱스를 경유해 테이블 블럭액세스 하는 도중 디스크에서 캐시로 블록적재해야 하는 경우 발생하며, 다른테이블 블록까지 미리적재해두는 기능. 리프 블록에 있는 인덱스 레코드는 논리적인 순서를 따라 읽다가 디스크I/O가 필요해지면 현재 읽던 리프 블록내에서 앞으로 읽어야 하는 테이블블록 주소목록을 미리 취합할 수 있음.
Random 액세스 성능을 향상 시키려고 버퍼Pinning과 테이블Prefetch같은 기능을 사용
버퍼Pinning은 Random 액세스에 의한 논리적 블록 요청횟수를 감소
테이블 Prefetch는 디스크 I/O에 의한 대기 횟수를 감소
이기능은 클러스터링 팩터가 나쁠때 특히 효과 발휘, 클러스터링 팩터가 나쁘면 논리적 I/O가 증가할 뿐 아니라, 디스크I/O도 많이 발생
I/O Call을 병렬방식으로 동시에 여러개 수행 하는것이므로 읽어야 하는 블록이 서로다른디스크 드라이브에 위치한다면 Prefetch 성능향상을 더 높일수 있음. 읽어야 하는 블록을 미리 적재하는 기능이므로 시스템전반에 디스크 경합을 줄여주기 보다는, I/O를 위한 시스템call을 줄이고 개별쿼리의 수행 속도를 향상시키는데 주로 도움을 줌. 데이터블록을 읽는 도중에 물리적인 디스크IO가 필요한 때면 서버프로세스는 I/O서브시스템에 I/O Call을 발생시키고 잠시 대기상태에 빠짐. 어짜피 대기상태에 잠시 쉬어야 하므로 곧이어 읽을 가능성이 높은 블록들을 버퍼캐시에 미리 적재해 놓는 다면 대기 이벤트 발생횟수를 그만큼 줄일 수 있음.
Prefetch는 db file parallel read 대기 이벤트로 측정
Multiblock IO도 Prefech기능중 하나(Multiblock IO은 한번의 IO call로써 서로인접한 블록들을 같이 읽어적재
-Prefech된 블록 모니터링하는 쿼리
SELECT NAME, VALUE FROM V$SYSSTAT
WHERE NAME IN ('physical reads cache prefech','prefetched blocls aged out before use');
'SQL' 카테고리의 다른 글
[인덱스 설계 방안 1] (0) | 2024.02.19 |
---|---|
SQL 조인 시 조건 ON과 WHERE 차이 (0) | 2022.06.21 |
[그룹함수 / ROLLUP] (0) | 2021.12.29 |
[계층형 질의] (0) | 2021.12.21 |
집합 연산자 (SET OPERATOR) (0) | 2021.12.20 |