4. Prefetch
2010.07.10 14:32
- Prefetch : 테이블과 인덱스를 미리 읽어오는 기법
(다른뜻 : 한번의 Fetch Call로 Array 크기 만큼 여러개 레코드를 가져오는 ‘Row Prefetch')
- 대부분 DBMS에서 디스크 블록을 미리 읽어오는 기법을 제공한다.
- Prefetch는 한번에 인접하지 않는 여러개의 Single Block I/O를 읽어오는 것으로, 인접한 블록을 읽는 Multiblock I/O와는 다르다.
- Prefetch는 I/O Call을 병렬 방식으로 동시에 여러 개 수행하는 방법으로 서로 다른 디스크 드라이브에 위치하면 성능이 높아진다.
- Prefetch 성공률은 CKPT 프로세스가 관리하며 성공률이 낮아지면 기능을 정지시킨다.
- (관찰) select * from big_emp를 실행시킨 후 결과
select name, value from v$sysstat
where name in ('physical reads cache prefetch', 'prefetched blocks aged out before use');
NAME VALUE( 교재에서는 각각 51094, 38 )
physical reads cache prefetch 11956
prefetched blocks aged out before use 0
- Prefetch는 db file parallel read 대기 이벤트로 측정된다.
▣ 인덱스 Prefetch
- 오라클 7.2부터 사용한 기능으로 인덱스의 블록을 미리 읽는 방법이다.
- 사례 : 그림 참조
- ①②③④ 순으로 Index Range Scan을 한다면 2번 브랜치블록을 읽고 5번 리프블록을 읽을 때 6,7번을 미리 적재하는 것이 좋다.(Multiblock 블록 I/O도 같이 사용 가능)
- Index Full Scan의 경우 리프블록을 모두 Prefetch 하면 효율적이다.(이 경우 정상적인 Index Full Scan과 달리 리프 블록 바로 위의 인덱스 브랜치 블록들을 읽는 약간의 비효율 감수해야 한다.)
- Index Prefetch 파라메터
_index_prefetch_factor : 기본은 100, 값이 작을 수록 옵티마이저가 Prefetch를 선호
_db_file_noncontig_mblock_read_count : Prefetch 최대 블록 수, 1 이면 Prefetch 정지.
▣ 테이블 Prefetch
- 테이블 Lookup Prefetch 또는 테이터 블록 Prefetch라고 한다. 오라클 7.2부터 사용한 기능으로 인덱스의 블록을 미리 읽는 방법이다.
- 사례 : 그림 참조
- ①②③④⑤⑥⑦ 순서로 읽을 경우, 5번을 읽고 13번 읽을 때 13,15,18을 미리 적재한다.
- 인덱스 클로스터 효과가 나쁠 때 효과적이다.
- 버퍼 pinning은 논리적 블록 요청 횟수를 감소시키고, 테이블 Prefetch는 디스크 I/O에 대한 디스크 I/O 대기 횟수를 감소시킨다.
- 테이블 Prefetch 파라메터
_table_lookup_prefetch_size : 기본 값 40
_table_lookup_prefetch_thresh : 기본 값 2
_multi_join_key_table_lookup : 기본 값 TRUE
- DB2의 경우 4-11번까지를 모두 읽은 다음, 결과에 대한 rowid를 얻어서 테이블를 접근.
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
27 | 8. 애플리케이션 커서 캐싱 | 토시리 | 2010.06.29 | 6742 |
26 | 9. Static vs. Dynamic SQL [1] | balto | 2010.07.03 | 18608 |
25 | 10. Dynamic SQL 사용 기준 | balto | 2010.07.03 | 8760 |
24 |
11. Static SQL 구현을 위한 기법들
![]() | 실천하자 | 2010.07.04 | 12273 |
23 |
4. Array Processing 활용
![]() | 휘휘 | 2010.07.04 | 21041 |
22 | 1. Call 통계 | 실천하자 | 2010.07.04 | 10603 |
21 |
5. Fetch Call 최소화
![]() | 휘휘 | 2010.07.05 | 17105 |
20 | 5장. 데이터베이스 Call 최소화 원리 | 휘휘 | 2010.07.05 | 6241 |
19 |
2. User Call vs. Recursive Call
![]() | 토시리 | 2010.07.07 | 9191 |
18 |
3. 데이터베이스 Call이 성능에 미치는 영향
![]() | 토시리 | 2010.07.07 | 11804 |
17 | 6장. I/O 효율화 원리 | 휘휘 | 2010.07.07 | 6554 |
» |
4. Prefetch
![]() | balto | 2010.07.10 | 28599 |
15 |
5. Direct Path I/O
![]() | balto | 2010.07.10 | 12352 |
14 | 8. PL/SQL 함수 호출 부하 해소 방안 | 토시리 | 2010.07.11 | 14223 |
13 | 6. 페이지 처리의 중요성 | 실천하자 | 2010.07.11 | 6971 |
12 | 2. Memory vs. Disk I/O | 휘휘 | 2010.07.11 | 7569 |
11 | 3. Single Block vs. Multiblock I/O | 휘휘 | 2010.07.11 | 9329 |
10 | 7. PL/SQL 함수의 특징과 성능 부하 | 실천하자 | 2010.07.12 | 12765 |
9 |
1. 블록 단위 I/O
![]() | 토시리 | 2010.07.12 | 9528 |
8 |
1. Library Cache Lock
![]() | balto | 2010.07.17 | 12946 |