2. DB 버퍼 캐시

  • 데이터파일에서 읽은 데이터 블럭의 복사본을 갖고 있는 SGA의 일부분
  • Buffer Cache에 필요로 하는 block이 존재하면 disk access를 하지 않음

(1) 블록단위 I/O

  • I/O는 블록 단위로 이루어짐
  • 데이터 파일에서 버퍼 캐시로 블록을 적재할 때, 인덱스를 경유한 테이블 엑세스 시에는 한번에 한블록씩 읽어들이지만(singleblock read), Full Scan 시에는 성능 향상을 위해 한번에 여러개의 블록을 읽어들임(multiblock read)
  • DBWR: 버퍼 캐시로부터 변경된 블록(Dirty 버퍼 블록)을 주기적으로 데이터파일에 기록

(2) 버퍼 캐시 구조

  • Free 버퍼 : 사용되지 않았거나 변경된 내용이 Disk에 내려쓰기가 완료됨
  • Dirty 버퍼 : 버퍼에 캐시된 이후 변경이 발생했지만, 아직 디스크에 기록되지 않아 데이터 파일 블록과 동기화가 필요한 버퍼 블록
  • Pinned 버퍼 : 읽기 또는 쓰기 작업을 위해 현재 액세스 되고 있는 버퍼
  • 해시 테이블 구조로 관리
  • 데이터 블록 주소 (DBA, Data Block Area) : DB 버퍼 캐시 내에서 데이터 블록을 해싱하기 위해 사용되는 키 값
  • 해시 함수에 데이터 블록 주소를 입력해 리턴받은 해시값이 같은 블록들을 같은 해시 버킷에 연결 리스트 구조로 연결
  • 각각의 연결 리스트를 해시 체인이라고 함
  • 버퍼 헤더(Buffer Header)만 해시 체인에 연결되며, 실제의 데이터 값이 필요해지면 버퍼헤더에 있는 포인터를 이용해 다시 버퍼 블록을 찾아가는 구조

(3) 캐시 버퍼 체인

  • 각 해시 체인은 래치(Latch)에 의해 보호됨
  • DB 버퍼 캐시는 공유 메모리 영역인 SGA 내에 존재하므로 여러 프로세스에 의한 동시 액세스가 일어날 가능성이 큼. 따아서 같은 리소스에 대한 액세스를 반드시 직렬화해야 함. 이를 위해 구현된 일종의 Lock 매커니즘을 래치라고 함
  • 래치를 획득한 프로그램만이 그 래치에 의해 보호되는 자료구조로의 진입 허용
  • 두 개 이상의 프로세스가 같은 해시 체인으로 진입해 새로운 버퍼 블록을 연결하고 해제하는 작업을 동시에 진행할 시 문제가 발생할 수 있으므로, 이를 방지하기 위해 Cache buffer chain 래치 사용
  • 하나의 cache buffer chain 래치가 여러 개 해시 체인을 동시에 관리
  • 해시 체인을 스캔하거나 거기에 블록을 추가 , 제거할 때 래치가 요구됨

(4) 캐시 버퍼 LRU 체인

  • DB 버퍼 캐시는 한번 읽은 데이터 블록을 캐싱해 두는 메모리 공간이지만 메모리는 유한한 자원이어서 모든 데이터를 캐싱할 수 없음. 버퍼 캐시가 사용빈도가 높은 데이터 블록들 위주로 구성될 수 있도록 LRU(least recently used) 알고리즘을 사용해 관리 됨.
  • 모든 버퍼 블록 해더를 LRU 체인에 연결해 사용빈도 순으로 위치를 옮겨가다, Free 버퍼가 필요해질 때마다 액세스 빈도가 낮은 데이터 블록들을 우선하여 밀어냄으로써 자주 액세스되는 블록들이 캐시에 더 오래 남아 있도록 관리
  • Dirty 리스트 : 캐시 내에서 변경됐지만, 아직 디스크에 기록되지 않은 Dirty 버퍼 블록들을 관리, LRUW(LRU Write)리스트라고 함
  • LRU 리스트 : 아직 Dirty 리스트로 옮겨지지 않은 나머지 ㅣ버퍼 블록들을 관리
  • LRU 리스트를 보호하기 위해 사용하는 래치를 cache buffer lru chain 래치라고 함