2.1 Database Buffer Cache 구조
Database Buffer Cache는 오라클의 핵심 메모리 영역으로, 디스크 I/O를 줄이고 SQL 실행 성능을 높이기 위한 캐시 역할을 한다. 디스크에서 데이터를 읽을 때는 블록 단위 I/O가 수행되며, 이 블록들은 버퍼 캐시에 로드된다.
🔍 블록 식별 구조: 해시 버킷과 체인
- 오라클은 데이터 블록을 빠르게 찾기 위해 해시 테이블을 사용한다.
- 해시 테이블의 각 엔트리는 **해시 버킷(Hash Bucket)**이며, 동일 해시값을 가진 블록들은 **연결 리스트(체인)**로 연결된다.
- 각 체인은 **버퍼 헤더(Buffer Header)**를 통해 연결되며, 이 버퍼 헤더는 해당 블록의 위치, 상태, LRU 및 해시 체인 포인터 등을 포함한다.
- 사용자가 특정 블록을 요청하면, 오라클은 해당 블록의 주소를 해시 함수로 계산하여 버킷을 찾고, 그 버킷에 연결된 체인을 따라가며 원하는 블록을 탐색한다.
-- 해시 버킷 개수 확인 SQL 예시
SELECT name, value FROM v$parameter WHERE name = 'db_block_hash_buckets';
🎯 체인 탐색 비용 최소화 전략: 하나의 체인에 여러 버퍼가 걸리면 탐색 비용이 증가하므로, 하나의 체인에 하나의 버퍼만 걸리는 것을 이상적인 상태로 본다. 이를 위해 해시 버킷 수를 충분히 확보하고, 해시 분포가 균등해야 한다.
2.2 Latch(래치) 메커니즘
Buffer Cache는 다수의 세션이 동시에 접근하는 공유 영역이기 때문에, **자료구조에 대한 직렬화(Serialization)**가 필수적이다. 이 역할을 수행하는 것이 바로 **래치(Latch)**이다.
✅ 래치의 특징
- 래치는 데이터 보호가 아닌, SGA의 공유된 내부 자료구조 보호를 위한 경량 락이다.
- 사용 시점:
- 해시 체인을 스캔할 때
- 버퍼 블록을 추가하거나 제거할 때
- LRU 리스트를 갱신할 때
- 래치는 매우 빠르게 작동하는 Spin Lock 형태로 구현되어, 짧은 시간 동안만 유지되며 빠른 자원 접근을 보장한다.
🔄 오라클에서 '읽기 전용 모드'란 단순히 SELECT 문을 실행하는 것이 아니라, 해시 체인을 따라가며 필요한 블록을 찾는 작업 전체를 의미한다. 이 모든 탐색 작업은 래치의 보호 하에 수행된다.
2.3 LRU 체인 구조
Buffer Cache는 재사용 정책을 위해 LRU (Least Recently Used) 리스트를 사용한다. 이 리스트는 크게 두 가지로 나뉜다:
- Dirty List:
- 수정된 블록으로, 아직 디스크에 쓰이지 않음.
- DBWR 프로세스가 디스크에 플러시하기 전까지 유지됨.
- LRU List:
- 아직 변경되지 않았거나, 이미 디스크에 반영된 블록들.
- 재사용 대상이며, 새로운 블록을 로드할 때 가장 오래된 것부터 제거됨.
📌 버퍼 헤더는 이 두 리스트 중 하나에 반드시 소속되어 있으며, 리스트 간 이동 또한 래치의 보호 하에 수행된다.
2.4 버퍼 상태의 3가지 유형
Buffer Cache의 각 블록은 다음 세 가지 상태 중 하나로 존재한다:
상태설명
| Free Buffer | 어떤 데이터도 없는 초기 상태의 블록. 재사용 가능. |
| Dirty Buffer | 변경되었지만 아직 디스크에 반영되지 않은 블록. DBWR 대상. |
| Pinned Buffer | 현재 세션이 사용 중인 블록. 다른 세션에서 접근 불가. |
📘 이 상태들은 Buffer Management, Dirty List 처리, 세션 동기화에 모두 관여하며 성능에 직결되는 요소이다.
2.5 요약 및 실무 팁
- Buffer Cache는 블록 단위 I/O를 캐싱하여 성능 향상을 꾀한다.
- 해시 테이블 + 체인 구조를 통해 빠르게 원하는 블록에 접근 가능하다.
- 버퍼 헤더는 블록 메타데이터와 해시 체인 및 LRU 포인터를 포함하여 탐색과 관리에 핵심적이다.
- 래치는 SGA 자료구조 보호를 위한 경량 락으로, 모든 체인 탐색, 버퍼 이동 시점에 사용된다.
- LRU는 Dirty와 Clean 리스트로 구성되어 버퍼 교체 정책을 제어한다.
- 각 블록은 Free, Dirty, Pinned 상태를 가지며, 이를 통해 작업 흐름이 제어된다.
📎 관련 태그
#Oracle #SGA #BufferCache #Latch #HashChain #LRU #DirtyBuffer #PinnedBuffer #FreeBuffer #BlockIO #BufferHeader #DatabasePerformance #OracleMemoryArchitecture
'인공지능 & 데이터 사이언스 > 데이터분석 및 스터디' 카테고리의 다른 글
| AI 개발자를 위한 MCP 실전 튜토리얼 — JSON-RPC 예제로 배우는 Agent 연결 방식 (0) | 2025.07.15 |
|---|---|
| 3장. 버퍼 락(Buffer Lock) (1) | 2025.06.06 |
| 1장. 오라클 기본 아키텍처 (4) | 2025.06.06 |