TECH
QUESTION
자주하는 질문답변 입니다.
Oracle
작성자 | 유건데이타 | 등록일 | 2015-05-18 |
제목 | Multiple Buffer Pool의 개념 및 사용 방법 | ||
---|---|---|---|
Multiple Buffer Pool의 개념 및 사용 방법
----------------------------------------------------------------------- 1. 필요성 table이나 index 등 segment는 그 사용 빈도나 중요도 등에 따라 memory에 buffering되는 것을 달리 할 필요가 있다. Oracle8에서는 buffer cache에 대해서 multiple buffer pool이라는 새로운 특성의 개념을 제공하여 segment마다 다른 buffer를 사용할 수 있도록 하고 있다. multiple buffer pool은 'keep', 'recycle', 그리고 'default' buffer pool로 구성되며, 이것을 control하기 위한 internal algorithm은 하나의 buffer pool을 사용할 때와 대부분 마찬가지다. 즉, 기존의 CACHE option이나 full table scan 시 LRU end에 위치시키는 것 등은 모두 변함이 없으며, 단지 그러한 기법들이 각 buffer마다 별도로 적용된다는 것 뿐이다. 2. buffer의 종류 multiple buffer pool의 주요 목적은 서로 다른 형태로 사용되는 것을 나누어 놓 아 서로 방해가 되지 않도록 하는 것으로 정리할 수 있으며, 각각 다음과 같은 경우에 사용하도록 한다. (1) KEEP buffer pool : 가능한 한 memory에 오랫동안 유지되어져야 하는 segment를 위해 사용되어져야 한다. 자주 사용되어지고 cache size의 약 10% 전후의 크기를 가진 segment가 이 pool을 사용하기에 적당하다. 그러나, 여기에서도 Oracle7.3의 CACHE option과 마찬가지로 새로이 access 되는 segment에 의해 LRU end 쪽으로 이동하는 것이 가능하므로 항상 cache 된다고 보장할 수는 없다. 적당한 크기로 지정하는 것이 중요한데 당연히, 동시에 memory에 올려지기를 바라는 object들의 크기의 합보다는 커야 한다. (2) RECYCLE buffer pool : 자주 사용되어지지 않거나, buffer pool의 두배보다 큰 정도의 큰 segment가 index search를 하는 작업 등에 사용되어지도록 한다. (3) DEFAULT buffer pool : 위의 두 buffer pool에 할당되지 않은 나머지는 default buffer pool이 된다. 그러므로 KEEP이나 RECYCLE buffer pool은 없어도 반드시 default buffer pool은 존재하게 된다. 이 buffer pool은 Oracle7의 하나의 buffer pool과 같다. 3. buffer pool을 설정하는 방법 이러한 종류의 buffer pool을 지정하기 위해서 BUFFER_POOL_KEEP과 BUFFER_POOL_RECYCLE이라는 parameter가 존재하며, DB_BLOCK_BUFFERS 와 DB_BLOCK_LRU_LATCHES parameter도 함께 고려하여야 한다. syntax는 다음과 같다. BUFFER_POOL_KEEP=(buffers: BUFFER_POOL_KEEP= BUFFER_POOL_RECYCLE=(buffers: BUFFER_POOL_RECYCLE= 위의 syntax에서 보는 바와 같이 각 pool에 대해서 buffer의 갯수 뿐 아니라 LRU latch의 갯수도 지정할 수 있다. 만약 지정하지 않으면 그 pool에 대해서 하나의 latch가 할당되는 것이다. DEFAULT pool에 대해서는 명시적으로 block의 갯수나 latch의 갯수를 지정할 수 없고, 대신 전체 block의 갯수 (DB_BLOCK_BUFFERS)와 전체 LRU latch의 갯수 (DB_BLOCK_LRU_LATCHES)에서 KEEP과 RECYCLE에 할당된 각각의 값을 뺀 것만큼 default pool에 할당된다. 간단한 예제로 설명하면 다음과 같다. 예를 들어 initSID.ora file에 다음과 같이 parameter가 설정되어 있다고 가정한다. DB_BLOCK_BUFFERS=1000 DB_BLOCK_LRU_LATCHES=6 BUFFER_POOL_KEEP=(buffers:400,lru_latches:2) BUFFER_POOL_RECYCLE=100 이러한 경우 KEEP pool에 대해서는 400개의 block과 2개의 LRU latch가 할당 되고 RECYCLE pool에는 100개의 block과 1개의 LRU latch가 할당된다. 그리 고 DEFAULT pool에는 500 (1000-400-100) 개의 block과 3 (6-2-1)개의 LRU latch 가 할당되게 된다. 각 LRU queue에 대해서 block은 균등하게 배분된다. 즉, 이 예에서 DEFAULT queue는 LRU 1번이 167개의 block을 LRU2도 167개, 그리 고 LRU3은 166개의 block을 가지게 되며, KEEP queue는 두개의 latch가 각각 200개씩의 block을 그리고 RECYCLE queue는 100개의 block을 가지게 된다. 이러한 정보는 v$buffer_pool을 통해 확인이 가능하며, 이 예의 경우 다음과 같이 조회된다. 여기에서 set_count가 각 pool에 할당된 latch의 갯수이며, lo_bnum과 hi_bnum이 buffer의 range이다. SQL> select * from v$buffer_pool; NAME LO_SETID HI_SETID SET_COUNT BUFFERS LO_BNUM HI_BNUM ---------- -------- -------- ---------- ---------- ---------- ---------- 0 0 0 0 0 0 KEEP 4 5 2 400 0 399 RECYCLE 6 6 1 100 400 499 DEFAULT 1 3 3 500 500 999 각 queue는 최소 50개의 block은 할당받아야 하며, 그렇지 않은 경우에는 오류 가 발생한다. 즉 예를 들어, BUFFER_POOL_KEEP=(buffers:100, lru_latches:3)과 같이 설정하면 alert.log file에 "Incorrect parameter specification for BUFFER_POOL_KEEP"이라는 오류 메시지가 적히게 되며, 100개의 block에 대해서 최대 두개의 LRU latch만이 가능하게 된다. 4. buffer pool을 지정하는 방법 BUFFER_POOL이라는 Oracle8에서 새로 추가된 storage 절의 parameter를 이용 하여 segment가 사용할 default pool을 지정할 수 있다. segment의 모든 block은 지정된 pool을 사용하게 되며, 아래의 예제와 같이 사용하면 된다. CREATE TABLE keep_table(t NUMBER(10)) STORAGE (BUFFER_POOL KEEP); ALTER TABLE recycle_table storage(BUFFER_POOL RECYCLE); BUFFER_POOL은 tablespace나 rollback segment에 대해서는 지정할 수 없으며, clustered table에 대해서는 cluster level에서만 지정이 가능하다. partition table에 대해서는 각 partition별로 pool을 지정하는 것이 가능하다. 일단 segments가 적당한 pool에 할당이 되고 난 후에는, logical hit ratio나 free buffer waits와 같은 다양한 통계 정보가 확인 가능하다. 이러한 통계 정보를 담고 있는 view는 v$buffer_pool_statistics이며, 이 view는 $ORACLE_HOME/rdbms/admin/catperf.sql을 수행하면 생성된다. |
Comment | |||
---|---|---|---|
등록된 코멘트가 없습니다. |