오라클 데이터베이스에서 버퍼 캐시(Buffer Cache)는 SGA(System Global Area)의 주요 구성 요소 중 하나로, 디스크 I/O를 최소화하고 성능을 향상시키기 위해 데이터 파일에서 읽은 데이터 블록의 복사본을 메모리에 저장하는 역할을 합니다. 이렇게 함으로써 데이터 액세스 시 디스크에 직접 접근하는 대신 메모리에서 빠르게 데이터를 읽을 수 있습니다.
버퍼 캐시는 내부적으로 해시 테이블(Hash Table)과 LRU(Least Recently Used) 리스트로 구성되어 있습니다.
해시 테이블: 데이터 블록 주소(DBA: Data Block Address)를 기반으로 해시 함수를 적용하여 해당 블록이 버퍼 캐시에 존재하는지 빠르게 확인합니다.
LRU 리스트: 최근 사용된 순서대로 버퍼 블록을 정렬하여, 사용 빈도가 낮은 블록을 우선적으로 캐시에서 제거함으로써 메모리 사용 효율을 높입니다.
버퍼 캐시에 저장된 각 버퍼 블록은 다음과 같은 상태를 가집니다:
Free 버퍼: 현재 사용되지 않는 버퍼로, 새로운 데이터를 로드하기 위해 사용할 수 있는 상태입니다.
Pinned 버퍼: 현재 읽기 또는 쓰기 작업 중인 버퍼로, 다른 프로세스가 해당 버퍼를 액세스하지 못하도록 고정된 상태입니다.
Dirty 버퍼: 변경되었지만 아직 디스크에 기록되지 않은 버퍼로, 디스크와 동기화되지 않은 상태입니다. 이러한 버퍼는 DB Writer 프로세스에 의해 디스크에 기록되어야 하며, 그 후에 재사용될 수 있습니다.
오라클은 버퍼 캐시를 효율적으로 관리하기 위해 LRU 알고리즘을 사용합니다. 이는 최근에 사용된 버퍼일수록 리스트의 앞쪽에 위치시키고, 새로운 버퍼가 필요할 경우 리스트의 끝부분부터 찾아서 재사용합니다. 또한, DB Writer(DBWR) 프로세스는 Dirty 버퍼를 디스크에 기록하여 Free 버퍼를 확보합니다.