본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

데이터베이스 버퍼 캐시(Database Buffer Cache)는 DBMS 가 디스크의 데이터 블록을 읽어 와 메모리에 보관하는 공유 영역으로, 같은 블록을 다시 읽을 때 디스크 대신 메모리에서 읽게 하여 물리적 I/O 를 줄인다.

디스크 접근은 메모리 접근보다 훨씬 느리므로 DBMS 는 블록 단위로 데이터를 메모리에 올려 두고 읽기·쓰기를 그 사본에 한다. 원하는 블록이 메모리에 있으면 캐시 적중(논리적 읽기), 없으면 캐시 미스로 디스크에서 읽어 와야 한다(물리적 읽기). 메모리는 한정되어 있어 새 블록을 올릴 자리가 없으면 어떤 버퍼를 비울지 정하는 교체 정책이 필요하고, 수정된 버퍼는 비우기 전에 디스크에 써야 한다.[1]

Oracle 에서는 SGA(System Global Area) 안의 Database Buffer Cache 가 이 일을 한다.[2]

상태 뜻 재사용
미사용(Unused) 한 번도 쓰이지 않았거나 지금 비어 있다 바로 쓸 수 있어 가장 다루기 쉽다
클린(Clean) 블록 사본을 담고 있지만 디스크와 내용이 같다 디스크에 쓰지 않고 바로 재사용할 수 있다
더티(Dirty) 수정되었으나 아직 디스크에 기록되지 않았다 먼저 디스크에 기록(체크포인트)해야 재사용할 수 있다

버퍼는 세션이 쓰는 동안 고정(pinned)되어 메모리에서 밀려나지 않는다.[2]

ROWID 로 블록을 읽는 과정

편집 원본 편집

인덱스의 각 항목에는 테이블 행의 주소인 ROWID 가 들어 있다. Oracle 의 ROWID 는 데이터 오브젝트 번호, 데이터 파일 번호, 블록 번호, 블록 안의 행 위치로 이루어진다.[3] 인덱스로 찾은 ROWID 로 테이블 블록을 읽는 흐름은 다음과 같다.

  1. 인덱스에서 ROWID 하나를 읽고, 그 안의 블록 위치 정보(파일 번호 + 블록 번호)를 해시 함수에 넣어 해시값을 구한다
  2. 해시값이 가리키는 해시 버킷에 연결된 해시 체인을 따라가며 그 블록의 버퍼 헤더를 찾는다. 찾으면 캐시 적중으로, 메모리의 버퍼를 읽고 끝난다
  3. 못 찾으면(캐시 미스) LRU 리스트를 스캔하며 새 블록을 담을 빈(재사용 가능한) 버퍼를 찾는다
  4. 빈 버퍼가 모자라면 더티 버퍼를 디스크에 기록해 빈 버퍼를 확보한다. Oracle 에서는 데이터베이스 기록 프로세스(DBW)가 이 일을 한다
  5. 디스크에서 블록을 읽어 확보한 버퍼에 적재하고, 그 버퍼를 읽는다

해시 체인은 여러 세션이 동시에 탐색·추가·삭제하므로 래치(Oracle 의 cache buffers chains 래치)로 보호된다. 같은 블록에 접근이 몰리면 이 래치에 경합이 생긴다.[4]

  • Oracle 의 기본 교체 알고리즘은 더티·클린 버퍼를 함께 가리키는 LRU 리스트를 쓴다. 리스트에는 최근에 자주 쓰인 버퍼가 모이는 핫 엔드와 오래 안 쓰인 버퍼가 모이는 콜드 엔드가 있다. 디스크에서 읽은 버퍼는 기본적으로 리스트 중간에 들어간다
  • 버퍼를 쓸 때마다 리스트를 재배열하지 않고 접근 횟수(touch count)를 세어 자주 쓰이는 블록을 남긴다
  • DBW 는 클린 버퍼를 찾지 못하거나 빈 버퍼 수가 임계값 아래로 떨어지면, 콜드 엔드에 닿은 더티 버퍼를 쓰기 대기열로 옮겨 디스크에 기록한다[2]
  • 커밋할 때는 리두 로그만 먼저 디스크에 쓰고 데이터 블록은 나중에 모아 쓴다(지연 쓰기). 장애가 나면 로그로 복구한다(데이터베이스 회복)

비슷한 개념과 구별하기

편집 원본 편집
구분 데이터베이스 버퍼 캐시 캐시 메모리(CPU) 운영체제 페이지 캐시
위치 DBMS 가 관리하는 메모리 영역 CPU 와 주기억장치 사이의 하드웨어 운영체제 커널 메모리
단위 데이터 블록(예: 8KB) 캐시 라인(예: 64바이트) 페이지
교체 LRU 변형 + 접근 횟수 하드웨어 교체 정책 커널의 페이지 교체 정책(LRU 등)
  1. ↑ Silberschatz, Korth, Sudarshan, 「Database System Concepts 7th Edition - Chapter 13: Data Storage Structures」(Database Buffer), https://www.db-book.com/slides-dir/PDF-dir/ch13.pdf, 확인일: 2026-11-04.
  2. ↑ 2.0 2.1 2.2 「Memory Architecture - Database Buffer Cache」, Oracle Database 19c Concepts, https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/memory-architecture.html, 확인일: 2026-11-04.
  3. ↑ 「ROWID Pseudocolumn」, Oracle Database 19c SQL Language Reference, https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/ROWID-Pseudocolumn.html, 확인일: 2026-11-04.
  4. ↑ 「Instance Tuning Using Performance Views - latch: cache buffers chains」, Oracle Database 19c Performance Tuning Guide, https://docs.oracle.com/en/database/oracle/oracle-database/19/tgdba/instance-tuning-using-performance-views.html, 확인일: 2026-11-04.