버퍼 블록의 상태

출처: 오라클 성능 분석과 인스턴스 튜닝 핵심 가이드
모든 버퍼캐시 블록은 아래 3가지 상태 중 하나의 상태에 놓인다.
- FREE 버퍼
- 인스턴스 기동 후 아직 데이터가 읽히지 않아 비어있는 상태 (CLEAN 버퍼) 이거나, 데이터가 담겼지만 데이터파일과 서로 동기화되어 있는 상태여서 언제든지 덮어써도 무방한 버퍼블록
- 오라클이 데이터파일에서 새로운 데이터블록을 로딩하려면 먼저 FREE 버퍼를 확보해야 한다
- FREE 상태인 버퍼에 변경이 발생하면 그순간 DIRTY 버퍼로 상태가 바뀐다
- DIRTY 버퍼
- 버퍼캐시에 적재된 이후 변경이 발생했지만, 아직 데이터파일에 기록하지 않아 동기화가 필요한 버퍼블록
- 이 버퍼블록들을 다른 데이터블록을 위해 재사용하려면 데이터 파일에 먼저 기록해야 하며, 그순간 FREE 버퍼로 상태가 바뀐다
- PINNED 버퍼
- 읽기 또는 쓰기 작업을 위해 현재 액세스되고 있는 버퍼 블록
버퍼캐시에 적재된 블록 내용과 데이터파일의 블록 내용이 서로 다른 (=동기화되지 않은) 블록을 DIRTY 블록 이라고 한다.
버퍼캐시에 적재된 이후 변경이 발생했지만, 아직 데이터파일에 기록하지 않아 동기화가 필요한 버퍼 블록을 DIRTY 버퍼 라고 한다.
| 상태 | 설명 |
|---|---|
| Free Buffer | 비어 있거나, 디스크와 내용이 일치하여 언제든 새로운 데이터를 덮어써도 되는 상태 |
| Dirty Buffer | 데이터가 수정되어 디스크와 내용이 다른 상태. (DBWR에 의해 디스크에 기록되어야 함) |
| Pinned Buffer | 현재 특정 프로세스가 읽기나 쓰기를 위해 사용 중인 상태 (다른 프로세스가 접근 못 함) |
오라클 데이터베이스에서 **Dirty Block(더티 블록)**과 **Dirty Buffer(더티 버퍼)**는 사실상 같은 상태를 가리키는 용어이지만, 강조하는 **‘관점’**에 따라 약간의 뉘앙스 차이가 있습니다.
결론부터 말씀드리면, **“메모리에서 데이터가 수정되었으나 아직 디스크에 저장되지 않은 상태”**를 말하며, 이를 담고 있는 메모리 공간을 강조할 때는 ‘버퍼’, 그 안의 데이터 단위(내용물)를 강조할 때는 ‘블록’이라고 부릅니다.
1. 용어의 정의와 차이
Dirty Buffer (더티 버퍼)
- 관점: 메모리 공간(Container)
- 설명: 데이터베이스 버퍼 캐시(SGA 내 공간) 내의 특정 **버퍼(방)**를 의미합니다.
- 상태: 사용자가 데이터를 수정(UPDATE, INSERT 등)하면, 해당 데이터를 담고 있는 메모리 상의 버퍼 상태가 ‘Dirty’로 표시됩니다.
- 의미: “이 메모리 공간은 수정된 데이터를 담고 있으므로, 함부로 비우거나 다른 데이터를 덮어쓰면 안 된다(디스크 기록 전까지)“는 것을 나타냅니다.
Dirty Block (더티 블록)
- 관점: 데이터 단위(Content)
- 설명: 디스크에서 읽어온 데이터 블록 자체가 수정된 상태를 의미합니다.
- 의미: “이 데이터 블록은 디스크에 저장된 원본과 내용이 다르다(동기화가 필요하다)“는 데이터의 상태를 강조합니다.
2. Dirty 상태의 특징
-
불일치: 메모리의 데이터와 디스크(Data File)의 데이터가 서로 다른 상태입니다.
-
Commit과는 무관:
- 사용자가
COMMIT을 눌렀다고 해서 바로 디스크에 기록되는 것이 아닙니다. Commit 여부와 상관없이 메모리에서 수정되는 즉시 Dirty 상태가 되며, 실제 디스크 기록은 DBWR(Database Writer) 프로세스가 나중에 일괄적으로 처리합니다.
- 사용자가
정리하자면
현장에서는 두 용어를 혼용해서 쓰는 경우가 많습니다. “더티 블록이 많아서 DBWR이 바쁘다”거나 “더티 버퍼를 비워야 한다”는 말은 모두 **“메모리에서 수정된 데이터를 디스크로 옮겨야 한다”**는 동일한 맥락에서 이해하시면 됩니다.

-
Free buffer: 아직 데이터가 할당되지 않은 buffer block(unused) 이거나, pinned buffer 였다가 서버 프로세스의 사용이 종료되고 update 되지 않은 buffer(Clean). 디스크에서 읽은 신규 데이터를 할당 가능함.
-
Pinned buffer: 데이터가 할당 된 후 수정되지 않고 사용자 세션에 의해 사용되고 있는 buffer block
- 서버 프로세스 사용 종료 시 clean.
-
Dirty buffer: 데이터가 이미 할당된 이후에 다시 데이터가 수정되었으나, 아직 disk 상의 data file에 write 되지 못한 buffer block.
- 일정 수준 이상의 Dirty buffer가 쌓이면 그때서야 disk 상의 data file에 write 함. (I/O 성능 때문에)
Database Buffer Pools의 유형
-
DW성, 이력 통계 데이터와 같은 대용량의 데이터를 Access해야 할 경우 큰 Block Size 가 상대적으로 유리
-
이를 위해 DB_BLOCK_SIZE에 기술 된 SIZE와 다른 BLOCK 크기를 가진 테이블 스페이스 생성 가능(2K, 4K, 16K, 32K 등)
-
이와 같은 용도로 생성 된 테이블스페이스 상의 Object에 Access 할 경우 Non Default Buffer Pool을 이용 (다양한 사이즈를 정의해서 쓰겠다는 말임)
-
Default Buffer Cache: DB_BLOCK_SIZE 에서 정의 된 Block Size로 Block이 할당 된 Buffer Cache로서, 별도의 Storage Option이 없으면 Table/Index 등의 Object는 Default Buffer Cache에 등록
- Default Buffer Cache는 Aging Out(AO) 이라고, 잘 사용 안하면서 오래 된 Block을 내려놓음.
-
Keep Buffer Cache: Table/Index 등의 Object를 Keep Buffer 에 등록하면 Buffer Cache에서 내려오지 않고 지속적으로 유지 됨(AO 영향을 안 받음, 계속 올라가 있음). 자주 쓰이는 조회성 데이터의 메모리 Hit Ratio를 높이기 위해 사용
-
Recycle Buffer Cache: 비교적 Access 빈도가 적은 Object가 메모리에 올라오게 되면 해당 Transaction이 종료 된 후에는 다시 메모리에서 제거 됨. 거의 사용되지 않음.
-
| Buffer Pool 유형 | Buffer Cache 유형 | 크기 설정 파라미터 |
|---|---|---|
| Default Buffer Pool | Default Buffer Cache | DB_CACHE_SIZE |
| Keep Buffer | DB_KEEP_CACHE_SIZE | |
| Recycle Buffer | DB_RECYCLE_CACHE_SIZE | |
| Non Default Buffer Pool | Non Default Buffer Cache | DB_nK_CACHE_SIZE (n은 Kbyte block size. 2,4,8,16,32 중 하나) |