4._Prefetch
2012.05.21 22:09
Prefetch
- 테이블 Prefetch, 인덱스 Prefetch
- 디스크 블록을 읽을때 곧이어 읽을 가능성이 높은 블록을 미리 읽어옴
- 디스크 I/O 비용이 크기 때문에 한번의 I/CALL 을 통해 다량을 블록을 읽어들임
- 서로 다른 익스텐트에 위치한 블록을 배치 방식으로 미리 적재
- 읽을 가능성이 높은 블록이 미리적재됬을경우 성능 향상에 도움을 줌
- CKPT 프로세스에 의해 모니터링 (SYS.X$KCBKPFS)
SQL> select name,value from v$sysstat
2 where name in ('physical reads cache prefetch'
3 ,'prefetched blocks aged out before use');
NAME VALUE
---------------------------------------------------------------- ----------
physical reads cache prefetch 15873450
prefetched blocks aged out before use 816967
SQL>
- I/O 를 위한 시스템 call을 줄이고 개별 쿼리의 수행 속도를 향상 시키는데 도움
- 데이터 블록을 읽는 도중에 물리적 디스크 I/O가 필요할때
- 서브프로세스는 I/O 서브 시스템에 I/O call 발생 -> 잠시 대기 상태로 전환
- (어짜피 쉬므로) 곧이어 읽을 가능성이 높을 블록을 버퍼 캐시에 미리 적재
- prefetch; db file parallel read 대기 이벤트로 측정
(1) 인덱스 Prefetch
- 오라클 7.2 버전부터 사용
- 1,2,3,4 순으로 Index Range Scan 진행
- 2번 브린치 블록에서 5번 리프블록을 읽는 시점에 물리적 i/o 발하며 6,7번 블록도 적재
- 이후 리프블록 스캔 진행시 디스크 i/o로 인한 대기 가능성이 줄어듬
- Sequential 액세스 성능 향상을 위해 Multiblock I/O 와 인덱스 Prefetch 기능 사용
- Index Full Scan이 일어날때 가장 효과적
- but) 리프 블록 위쪽에 있는 브랜치 블록을 추가적으로 읽기때문에 i/o가 약간 더 발생
- 보통의 index full scan 은 가장 왼쪽 브랜치 블록만 읽음
- 인덱스 Prefetch 를 제어하는 파라미터
- _index_prefetch_factor
- default 100, 작게 설정할수록 prefetch 선호
- _db_file_nonconting_mblock_read_count
- 한번에 최대 몇개 블록을 prefetch 할지 지정, 1 - prefetch 기능 정지
(2) 테이블 Prefetch
- 테이블 Lookup Prefetch 또는 데이터 블록 Prefetch
- 인덱스 -> 테이블 레코드를 액세스 -> 디스크에서 캐시로 블록을 적재(테이블 블록까지 미리 적재)
- 리프 블록에 있는 인덱스 레코드는 논리적인 순서이므로 리프 블록내에서 블록주소를 미리취합가능
- 5번 인덱스 리프 블록을 읽고 12번 테이블 블록을 읽는 시점에 물리적 I/O 발생 이때 13,15,18번 블록까지 적재
- 버퍼Pinning - Random 액세스에 의한 논리적 블록 요청 횟수를 감소
- 테이블 Prefetch - 디스크 I/O에 의한 대기 횟수를 감소
- 인덱스 클러스터링 팩터가 나쁠때 효과를 발휘
- 논리적 i/o증가 할뿐 아니라 디스크 i/o도 많이 발쌩
- 테이블 Prefetch 제어 파라미터
- _table_lookup_prefetch_size
- 기본 값 40
- _table_lookup_prefetch_thresh
- 기본값 2
- _multi_join_key_table_lookup
- 기본값 true
- db2
- 리프 블록을 먼저 스캔하고 거기서 얻은 rowid 순으로 정렬후테이블 액세스
- 각 테이블 블록을 한번씩만 액세스
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
46 | 3._비관적_vs._낙관적_동시성_제어 | dasini | 2012.03.26 | 6185 |
45 | 2._트랜잭션_수준_읽기_일관성 | AskZZang | 2012.03.20 | 6145 |
44 | 9._ASH(Active_Session_History) | 정찬호 | 2012.04.09 | 6071 |
43 | 2._Cursor_Sharing | 운영자 | 2012.05.28 | 5992 |
42 | 7._Response_Time_Analysis_방법론과_OWI | 시와처 | 2012.04.01 | 5743 |
41 | 4._DBMS_XPLAN_패키지 | AskZZang | 2012.04.04 | 5610 |
40 | 7._Consistent_vs._Current_모드_읽기 | 시와처 | 2012.03.18 | 5500 |
39 | 9._Static_vs._Dynamic_SQL | 남송휘 | 2012.05.07 | 5426 |
38 | 4._Redo | 남송휘 | 2012.03.12 | 5379 |
37 | 2장._트랜잭션과_Lock | AskZZang | 2012.03.17 | 5251 |
36 | 8._애플리케이션_커서_캐싱 | 박영창 | 2012.04.22 | 5242 |
35 | 3._라이브러리_캐시_구조 | dasini | 2012.04.06 | 5232 |
34 | 1_장._오라클_아키텍처 | AskZZang | 2012.03.02 | 4990 |
33 | 5._Fetch_Call_최소화 [1] | 박영창 | 2012.05.15 | 4809 |
32 | 1._트랜잭션_동시성_제어 | AskZZang | 2012.03.20 | 4667 |
31 | 6._바인드_변수의_부작용과_해법 | 시와처 | 2012.04.23 | 4645 |
30 | 5._V$SYSSTAT | AskZZang | 2012.04.04 | 4599 |
29 | 12._데이터베이스_성능_고도화_정석_해법 | 남송휘 | 2012.04.09 | 4574 |
28 | 2._User_Call_vs._Recursive_Call | 정찬호 | 2012.05.07 | 4427 |
27 | 1._Explain_Plan | 남송휘 | 2012.03.26 | 4330 |