메뉴 건너뛰기

bysql.net

4._Prefetch

2012.05.21 22:09

남송휘 조회 수:3585


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.png

  • 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
  • 인덱스 -> 테이블 레코드를 액세스 -> 디스크에서 캐시로 블록을 적재(테이블 블록까지 미리 적재)


2.png

  • 리프 블록에 있는 인덱스 레코드는 논리적인 순서이므로 리프 블록내에서 블록주소를 미리취합가능
  • 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 순으로 정렬후테이블 액세스
    • 각 테이블 블록을 한번씩만 액세스




  • 오라클 고도화 원리와 해법 1 (bysql.net 2012년 1차 스터디)
  • 작성자:  남송휘
  • 최초작성일: 2012년 5 월 20 일
  • 본문서는 bysql.net 스터디 결과입니다 .본 문서를 인용하실때는 출처를 밝혀주세요. http://www.bysql.net
  • 문서의 잘못된 점이나 질문사항은 본 문서에 댓글로 남겨주세요. ^^