4._Prefetch
2012.05.21 13: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
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
66 | 부록 | 남송휘 | 2012.06.05 | 2708 |
65 | 8._IO_효율화_원리 | 운영자 | 2012.06.05 | 4426 |
64 |
3._Deterministic_함수_사용_시_주의사항
![]() | 정찬호 | 2012.05.29 | 4351 |
63 | 2._Cursor_Sharing | 운영자 | 2012.05.28 | 6276 |
62 | 7._Result_캐시 | 운영자 | 2012.05.27 | 4426 |
61 |
3._Single_Block_vs._Multiblock_IO
![]() | 정찬호 | 2012.05.22 | 4229 |
60 |
2._Memory_vs._Disk_IO
![]() | 정찬호 | 2012.05.22 | 4446 |
59 |
1._블록_단위_IO
![]() | 정찬호 | 2012.05.22 | 4211 |
58 |
6장._IO_효율화_원리
![]() | 정찬호 | 2012.05.22 | 4085 |
57 |
1._Library_Cache_Lock_Pin
![]() | 남송휘 | 2012.05.21 | 4290 |
56 |
6._RAC_캐시_퓨전
![]() | 남송휘 | 2012.05.21 | 17797 |
55 | 5._Direct_Path_IO | 남송휘 | 2012.05.21 | 7932 |
» |
4._Prefetch
![]() | 남송휘 | 2012.05.21 | 3889 |
53 | 8._PLSQL_함수_호출_부하_해소_방안 | 남송휘 | 2012.05.21 | 3773 |
52 | 5._Fetch_Call_최소화 [1] | 박영창 | 2012.05.15 | 6065 |
51 |
7._PLSQL_함수의_특징과_성능_부하
![]() | 남송휘 | 2012.05.14 | 6935 |
50 | 6._페이지_처리의_중요성 | 남송휘 | 2012.05.14 | 3379 |
49 | 4._Array_Processing_활용 | 시와처 | 2012.05.13 | 4043 |
48 |
3._데이터베이스_Call이_성능에_미치는_영향
![]() | 시와처 | 2012.05.13 | 3645 |
47 |
10._Dynamic_SQL_사용_기준
![]() | 남송휘 | 2012.05.07 | 4556 |