Oracle 10g 강좌

Database buffer cache란?

  Database Buffer CacheDatafile 들로부터 읽은 Data Block의 복사본을 담고 있는 SGA의 한 부분 입니다.

  Oracle Instance에 동시 접속한 모든 User ProcessDatabase Buffer Cache에 대한 Access를 공유 합니다.

  또한 Database Buffer Cache는 아직까지 디스크에 완전히 쓰여지지 않는 수정된 데이터를 보유할 수도 있습니다.

  LRU 알고리즘에 의하여 가장 오래 전에 사용된 것은 디스크에 저장하고 메모리에는 가장 최근에 사용된 데이터를 저장 함으로써, 디스크 I/O를 줄이고, 데이터베이스 시스템의 성능은 증가 하게 관리 합니다.

  DBWR(Database Writer Process) 에 의해서 관리 됩니다.

  Free Buffer는 오라클 서버 프로세스에 할당되어 사용되고, 사용 후 Dirty Buffer가 된 Buffer들은 DBWR에 의해 디스크에 쓰여진 후 다시 Free Buffer가 되어 오라클 서버 프로세스에 의해 재사용되는 작업을 반복하게 됩니다.

 

Organization of the Database Buffer Cache

  Buffer CacheDirty List[=LRU Write list(LRUW)]Least Recently Used(LRU) List 두 개의 List로 구성되어 있습니다.

  Dirty listLRUW(LRU Write list)는 같은 의미 입니다.

  오라클 Database Buffer Cache 안의 블록들은 반드시 LRULRUW 둘 중의 하나에 등록되며, 두 리스트에 동시에 포함되는 경우는 없습니다

LRUW(LRU Write list) List

  - 수정되어 디스크에 반영되어야 할 블록들의 리스트.

  - LRUW에 모인 Dirty Buffer는 DBWR에 의해 디스크로 쓰여지고 나면 이 Buffer는 Free로 Mark 되어 다시 사용될 수 있도록 LRU List의 끝부분에 위치하게 됩니다.

LRU(Least Recently Used) List

  - 최근에 읽혀진 Datafile Block 을 Buffer Cache에 보관하고, 새로운 Block 이 파일에서 읽혀질 필요가 있으면 사용한지 가장 오래된 버퍼들부터 메모리에서 없어지도록 관리하기 위한 Buffer Cache 내의 Block List 관리 방법.

  - LRU(Least Recently Used) list의 버퍼들은 Free buffer, Pinned Buffer, Dirty Buffe중 하나로 존재하게 됩니다.

  - 처음엔 버퍼가 Free 상태인데 사용자가 질의를 해서 디스크에서 테이블의 내용을 읽으면 이 블록들은 LRU에서 가장 최근에 읽은 것 이므로 HEADER 부분(MRU, Most recently used)에 위치하게 됩니다.

  이 버퍼들이 차츰 다른 테이블의 내용들이 읽혀 짐에 따라 LRU의 tail부분인 LRU(Lease Recent Used)로 이동되게 되는 겁니다.

  만약 사용자가 대량의 데이터를 질의하여 버퍼가 필요한데 빈 버퍼가 없다면 제일 사용된 빈도가 작은 블록을 찾기 위해 LRU 알고리즘에 의해 LRU list의 맨 끝인 tail 부분부터 검색하기 시작 합니다.

  - Pinned Buffer : 현재 사용자가 사용 중이므로 재사용 될 수 없는 상태

  - Free Buffer : Dirty Buffer등이 데이터파일(디스크)에 기록되어져서 Free로 Mark가 되어 사용될 수 있는 상태의 버퍼 또는 Modify 되지 않아 사용가능 한 상태.

  - Dirty Buffer : 사용자가 사용하여 내용이 변경되었지만 아직 디스크에 기록되지 않은 버퍼를 나타냅니다

 

Size of the Database Buffer Cache

  DB_CACHE_SIZE : 디폴트 버퍼 캐시의 크기를 설정하는 파라미터로, 반드시 존재해야 하며, 0으로 설정할 수 없습니다.

  Oracle 8i까지는 단 종류의 블록 크기만을 제공했지만, Oracle9i부터는 한 데이터베이스 내에서도 블록 크기를 다양화 할 수 있습니다.

  Oracle 8i까지는 DB_BLOCK_SIZE 파라미터에서 데이터 블록 크기를 지정하였는데, Oracle9i부터는 표준블록 크기라 하며 가장 빈번하게 사용되는 블록 크기를 지정 합니다

  Oracle10g에서 SYSTEM tablespace는 표준 블록 크기만을 사용 할 수 있습니다.

  Oracle10g에서 2K,4K,8K,16K,32K의 블록 크기를 지원하며, 이러한 블록 크기로 각각 버퍼 캐시의 크기를 지정하려면 db_nK_CACHE_SIZE 파라미터를 사용 합니다.

  DB_nK_CACHE_SIZE에는 표준 블록 사이즈가 올 수 없습니다.

Example of Setting Block and Cache Sizes
  • - DB_BLOCK_SIZE=4096
  • - DB_CACHE_SIZE=1024M
  • - DB_2K_CACHE_SIZE=256M
  • - DB_8K_CACHE_SIZE=512M

  - 위에 예제를 간단히 설명을 하면, 표준 블록 크기는 4K이며, 1024M의 Database Buffer Cache를 사용 합니다.

  - 추가로 2K블록은 256M의 Database Buffer Cache를, 8K 블록은 512M의 Database Buffer Cache를 사용 합니다.

아래는 테이블스페이스를 생성시 BLOCKSIZE를 지정하는 예제입니다.
 
 -- 8K의 테이블 스페이스 생성
 -- BLOCKSIZE를 설정하지 않으면 표준 블록 크기를 사용 합니다.  
 SQL> CREATE TABLESPACE tbs_8k
      DATAFILE 'C:\oradata\tbs_8k.dbf' 
      SIZE 500M BLOCKSIZE 8k;  
    

 

Multiple Buffer Pools

  Multiple Buffer Pools 기능은 Object Access의 다양성 및 빈도의 차별성을 구분하여 Buffer Cache를 보다 세밀하게 관리할 수 있게 합니다.

  Tables, Clusters, Indexes, Partitions에 Buffer Pool을 설정 할 수 있습니다.

  Oracle10g는 이전 버전과 마찬가지로 KEEP과 RECYCLE buffer pool을 사용 할 수 있는데, 이는 DB_KEEP_CACHE_SIZE, DB_RECYCLE_CACHE_SIZE 파라미터를 이용 합니다.

  Multiple buffer pools은 standard block size(DB_CACHE_SIZE)만 사용 할 수 있습니다. DB_nK_CACHE_SIZE는 사용하지 못 합니다.

  DB_KEEP_CACHE_SIZE : Keep Buffer Cache의 크기, 재활용될 가능성이 높은 블록을 고정적으로 저장하는데 사용 합니다.

  DB_RECYCLE_CACHE_SIZE : 재활용 버퍼 캐시 크기, 재활용 될 가능성이 낮은 블록을 Access직후 바로 메모리에서 제거하도록 관리 되어집니다.

Buffer Pool 옵션

  - KEEP : Access 빈도가 아주 높은 Object들을 대상으로, 해당 Object의 모든 블록이 항상 메모리에 상주하도록 설정 합니다.

  - RECYCLE : 재사용 가능성이 비교적 낮은 특정 Object의 블록들을 Access직후 바로 메모리에서 제거하도록 관리 합니다.

  - DEFAULT : 기존의 단독 Buffer Cache와 동일한 관리체계를 갖는 기본 값 입니다.

Buffer Pool 설정 예제
 
SQL> CREATE TABLE table_name(id NUMBER) STORAGE(BUFFER_POOL KEEP);
    

- 강좌 URL : http://www.gurubee.net/lecture/1887

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by 유광종 [2007.11.24 13:49:34]
요즘 공부하는데 많은 도움이 됩니다.
check point queue에 대한 내용은 없네요. 추가하면 좋을듯 싶습니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입