메뉴 건너뛰기

bysql.net

4. Prefetch

2010.07.10 23:32

balto 조회 수:28434


- 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부터 사용한 기능으로 인덱스의 블록을 미리 읽는 방법이다.

- 사례 : 그림 참조

fig6-4.jpg


- ①②③④ 순으로 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부터 사용한 기능으로 인덱스의 블록을 미리 읽는 방법이다.

- 사례 : 그림 참조

fig6-5.jpg    

                     

- ①②③④⑤⑥⑦ 순서로 읽을 경우, 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를 얻어서 테이블를 접근.

번호 제목 글쓴이 날짜 조회 수
67 Front Page file 운영자 2010.05.17 154865
66 1 장. 오라클 아키텍처 운영자 2010.05.20 17842
65 1. 기본 아키텍처 [1] file 휘휘 2010.05.23 19899
64 3. 버퍼 Lock [1] 휘휘 2010.05.24 15225
63 2. DB 버퍼 캐시 file 휘휘 2010.05.24 21916
62 4. Redo file 휘휘 2010.05.24 11314
61 9. Snapshot too old balto 2010.05.30 8100
60 10. 대기 이벤트 balto 2010.05.30 8010
59 7. Consistent vs. Current 모드 읽기 휘휘 2010.05.31 10537
58 8. 블록 클린아웃 휘휘 2010.05.31 12282
57 11. Shared Pool file 실천하자 2010.05.31 18511
56 5. Undo file 토시리 2010.05.31 18650
55 1. 트랜잭션 동시성 제어 실천하자 2010.05.31 8631
54 6. 문장수준 읽기 일관성 file 토시리 2010.06.01 10432
53 2장. 트랜잭션과 Lock 운영자 2010.06.01 6895
52 1. Explain Plan 실천하자 2010.06.06 14663
51 2. AutoTrace 실천하자 2010.06.06 8597
50 3장. 오라클 성능 관리 운영자 2010.06.06 6694
49 3. SQL 트레이스 file balto 2010.06.06 21175
48 4. DBMS_XPLAN 패키지 balto 2010.06.06 10461