메뉴 건너뛰기

bysql.net

2. DB 버퍼 캐시

2010.05.24 03:58

휘휘 조회 수:21916

  • 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 버퍼

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





번호 제목 글쓴이 날짜 조회 수
67 Front Page file 운영자 2010.05.17 154864
66 1 장. 오라클 아키텍처 운영자 2010.05.20 17840
65 1. 기본 아키텍처 [1] file 휘휘 2010.05.23 19898
64 3. 버퍼 Lock [1] 휘휘 2010.05.24 15225
» 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 10536
58 8. 블록 클린아웃 휘휘 2010.05.31 12280
57 11. Shared Pool file 실천하자 2010.05.31 18511
56 5. Undo file 토시리 2010.05.31 18648
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
오늘:
1
어제:
1
전체:
2,197,966

Powered by XE.