2. DB 버퍼 캐시

조회 수 6938 추천 수 0 2010.05.26 20:15:37
휘휘 *.168.123.1
  • DB BUFFER CACHE: SGA 의 일부분으로 DATAFILE의 입출력시 사용시 사용되는 캐시 영역(블록단위)


  1. 블록 단위 I/O

  • 오클은 블록단위로 I/O가 이루어짐

  • 메모리 버퍼와 데이터파일간 읽기,쓰기 모두 블록단위로 처리

    • Single block read: 인덱스 경유시 한번에 한블록씩 읽어들임 

    • Multiblock read : Full Scan시에는 성능 향상을 위해 한번에 여러블록을 읽어 들임 

  • DBWR (BG 프로세서) : 버퍼캐시로부터 변경된 블록을 주기적으로 데이터 파일에 기록하는 작업 수행(블록단위)

  • SQL 성능을 좌우하는 가장 중요한 지표는 액세스하는 블록개수이며 옵티마이져에도 가장큰영향을 끼침

  1. 버퍼 캐시 구조

  • 해시 함수에 데이터 블록주소(DBA) 를 입력해 리턴받은 값(해시값) 이 같은 블록들을 해시버킷에
    연결리스트 구조로 해시 체인으로 연결

  • 찾고자 하는 데이터 블록 주소를 해시값으로 변환후 해시버킷 체인을 따라 스캔
    → 성공 하면 읽고
    , 실패하면 디스크로부터 읽은후 해시체인에 연결(다른사용자들을 위해서) 후 읽기진행

  • 버퍼 헤더만 체인에 연결, 실제 데이터 값이 필요해지면 버퍼해더에 있는 포인터를 이용해 다시 버퍼 블록을 찾아가는 구조

1-9.png


  1. 캐시 버퍼 체인

  • 각 해시 체인은 래치(Latch)에 의해 보호

  • 래치: SGA 영역의 동시 액세스에 따른 문제를 위한 직렬화 LOCK메커니즘

  • cache buffers chains : 두개이상의 프로세스가 같은 해시 체인을 동시작업할경우를  방지하기위한 래치

  • 참고 :래치의 종류 : 9i 241, 10g 394, 11g 496

XE의 래치수


SQL> select count(*) from v$latchname;


COUNT(*)

----------

384


  • 하나의 cache buffers chains 래치가 여러개 해시 체인을 동시에 관리 - 버퍼 캐시 크기와 버젼에 따라달라짐

  • 하나의 해시 버킷과 해시 체인은 1:1 관계
    ( _db_block_hash_buckets , _db_block_hash_latches
    피라미터 값으로 확인)

  • 목표한 해시 체인을 찾고서 추가적으로 스캔하는 비용을 최소화하기 위해 하나의 체인에 하나의 버퍼만 달리도록 해야함

  • 책의) 버킷 갯수 ? 2,097,152 , 블록 버퍼(_ db_block_buffers) 836,684 ; 버킷 개수가 2.5배 가량 많음

  • 9i 부터 읽기전용 작일 경우 cache buffers chains 래치를 Share모드로 획득가능
    ( 읽기전용작업이란 해시 체인을 스캔하면서 필요한 블록을 찾는 작업을 말함 )


※ http://blog.naver.com/dangtong76/140064903533 <- 래치와 락의 차이


  1. 캐시 버퍼 LRU 체인

     1-10.png
  • LRU(Least Recently used)알고리즘:  버퍼 캐시를 사용빈도가 높은(MRU;most recently used): 블록들 위주로 구성될수있도록 하는 알고리즘 (MRU end에서 부터 LRU end 순으로 정렬후 공간필요시 LRU end부터 버려나감)

  • 모든 버퍼 블록 헤더를 LRU 체인에 연결해 사용빈도 순으로 정렬한후 free 버퍼가 필요해질때마다
    빈도가 낮은 블록들을 우선버림

  • LRU 리스트

    • Dirty 리스트: 캐시 내에서 변경됬지만 디스크에 기록되지 않은 Dirty 버퍼 블록을 관리 ‘LRUW(LRU Write)리스트’

    • LRU 리스트: 아직 Dirty 리스트로 옮겨지지 않은 나머지 버퍼 블록들을 관리

    • 모든 버퍼 블록은 이둘중 하나에 반드시 속하지만 읽기 또는 쓰기 작업을 위해 액세스되는 동안 리스트에 풀렸다가 원래의 리스트로 연결, 최초 변경발생시에는 Dirty 리스트로 옮겨감

    • cache buffers lru chain : LRU 리스트를 보호하기 위해 사용하는 래치



버퍼상태 - 모든 캐시 버퍼는 세가지중 한가지 상태를 가짐

FREE 버퍼

  • 인스턴스 기동후 아직 데이터가 읽히지 않아 비어있는상태, 테이터가 있지만 언제 덮어써도 무방한 버퍼블록
  • 변경발생시 그순간 Dirty 버퍼로 상태가 변경


Dirty 버퍼

  • 변경되었지만 아직 디스크에 기록되지 않은상태 (동기화가 필요한상태)
  • 디스크에 기록되는 순간 Free 버퍼로 상태 변경


Pinned 버퍼

  • 읽기 또는 쓰기 작업을 위해 현재 액세스 되고 있는 버퍼 블록