버퍼 블록의 상태

출처: 오라클 성능 분석과 인스턴스 튜닝 핵심 가이드

모든 버퍼캐시 블록은 아래 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 PoolDefault Buffer CacheDB_CACHE_SIZE
Keep BufferDB_KEEP_CACHE_SIZE
Recycle BufferDB_RECYCLE_CACHE_SIZE
Non Default Buffer PoolNon Default Buffer CacheDB_nK_CACHE_SIZE
(n은 Kbyte block size. 2,4,8,16,32 중 하나)