데이터베이스 버퍼 캐시
더 많은 작업
데이터베이스 버퍼 캐시(Database Buffer Cache)는 DBMS 가 디스크의 데이터 블록을 읽어 와 메모리에 보관하는 공유 영역으로, 같은 블록을 다시 읽을 때 디스크 대신 메모리에서 읽게 하여 물리적 I/O 를 줄인다.
디스크 접근은 메모리 접근보다 훨씬 느리므로 DBMS 는 블록 단위로 데이터를 메모리에 올려 두고 읽기·쓰기를 그 사본에 한다. 원하는 블록이 메모리에 있으면 캐시 적중(논리적 읽기), 없으면 캐시 미스로 디스크에서 읽어 와야 한다(물리적 읽기). 메모리는 한정되어 있어 새 블록을 올릴 자리가 없으면 어떤 버퍼를 비울지 정하는 교체 정책이 필요하고, 수정된 버퍼는 비우기 전에 디스크에 써야 한다.[1]
Oracle 에서는 SGA(System Global Area) 안의 Database Buffer Cache 가 이 일을 한다.[2]
| 상태 | 뜻 | 재사용 |
|---|---|---|
| 미사용(Unused) | 한 번도 쓰이지 않았거나 지금 비어 있다 | 바로 쓸 수 있어 가장 다루기 쉽다 |
| 클린(Clean) | 블록 사본을 담고 있지만 디스크와 내용이 같다 | 디스크에 쓰지 않고 바로 재사용할 수 있다 |
| 더티(Dirty) | 수정되었으나 아직 디스크에 기록되지 않았다 | 먼저 디스크에 기록(체크포인트)해야 재사용할 수 있다 |
버퍼는 세션이 쓰는 동안 고정(pinned)되어 메모리에서 밀려나지 않는다.[2]
인덱스의 각 항목에는 테이블 행의 주소인 ROWID 가 들어 있다. Oracle 의 ROWID 는 데이터 오브젝트 번호, 데이터 파일 번호, 블록 번호, 블록 안의 행 위치로 이루어진다.[3] 인덱스로 찾은 ROWID 로 테이블 블록을 읽는 흐름은 다음과 같다.
- 인덱스에서 ROWID 하나를 읽고, 그 안의 블록 위치 정보(파일 번호 + 블록 번호)를 해시 함수에 넣어 해시값을 구한다
- 해시값이 가리키는 해시 버킷에 연결된 해시 체인을 따라가며 그 블록의 버퍼 헤더를 찾는다. 찾으면 캐시 적중으로, 메모리의 버퍼를 읽고 끝난다
- 못 찾으면(캐시 미스) LRU 리스트를 스캔하며 새 블록을 담을 빈(재사용 가능한) 버퍼를 찾는다
- 빈 버퍼가 모자라면 더티 버퍼를 디스크에 기록해 빈 버퍼를 확보한다. Oracle 에서는 데이터베이스 기록 프로세스(DBW)가 이 일을 한다
- 디스크에서 블록을 읽어 확보한 버퍼에 적재하고, 그 버퍼를 읽는다
해시 체인은 여러 세션이 동시에 탐색·추가·삭제하므로 래치(Oracle 의 cache buffers chains 래치)로 보호된다. 같은 블록에 접근이 몰리면 이 래치에 경합이 생긴다.[4]
- Oracle 의 기본 교체 알고리즘은 더티·클린 버퍼를 함께 가리키는 LRU 리스트를 쓴다. 리스트에는 최근에 자주 쓰인 버퍼가 모이는 핫 엔드와 오래 안 쓰인 버퍼가 모이는 콜드 엔드가 있다. 디스크에서 읽은 버퍼는 기본적으로 리스트 중간에 들어간다
- 버퍼를 쓸 때마다 리스트를 재배열하지 않고 접근 횟수(touch count)를 세어 자주 쓰이는 블록을 남긴다
- DBW 는 클린 버퍼를 찾지 못하거나 빈 버퍼 수가 임계값 아래로 떨어지면, 콜드 엔드에 닿은 더티 버퍼를 쓰기 대기열로 옮겨 디스크에 기록한다[2]
- 커밋할 때는 리두 로그만 먼저 디스크에 쓰고 데이터 블록은 나중에 모아 쓴다(지연 쓰기). 장애가 나면 로그로 복구한다(데이터베이스 회복)
- ↑ 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.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.
- ↑ 「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.
- ↑ 「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.