Buffer Cache Size(資料緩衝區)

pingley發表於2012-02-06
Buffer Cache Size(資料緩衝區)
資料庫緩衝區用作oracle執行sql語句的工作區。Sql需要查詢或者操作的資料
先從磁碟塊中讀取到緩衝區。緩衝區中的資料將會保留一段時間,這樣可以減
少IO操作。提高效能。資料庫緩衝區對於資料庫的效能很重要。一般要設定的
大一些以便快取經常訪問的資料塊。減少IO操作。但不能大到讓作業系統使用
虛擬記憶體。另外資料庫緩衝區過大可能會導致例項啟動緩慢,因為要格式化大
量的緩衝區。該區的大小與運用程式型別相關。

資料緩衝區的管理方式:
oracle維護了兩張列表用來維護資料緩衝區中的資料塊:
寫入列表(write list):用來維護髒快取塊(dirty block),指那些發生了
修改但是還沒有寫入資料檔案中的資料。
最近最少使用列表(least recently used,LRU):用來維護空閒的快取塊
(free buffers)、命中快取塊(pinned buffer),以及那些還沒有來的及
移動到寫入列表的髒資料塊。
那些沒有被經常訪問的資料存放在LRU的尾部,那些經常被訪問的資料儲存在
LRU的頭部,頭部也稱為MRU(most recently used),隨著那些被頻繁訪問的
資料不斷的移動到MRU端,相對訪問頻段比較低的資料被移動到LRU的尾部。
如果會話要訪問的資料不在資料緩衝區中,oracle就需要從資料檔案中讀入
那些需要被訪問的塊。在這之前,必須先查詢資料緩衝區中的空閒空間,(從
LRU端開始尋找)找到,在查詢過程中如果遇到髒資料,oracle會把髒資料移動
到寫入列表,如果尋找到合適的空閒空間oracle將從資料檔案中讀入想要的資料
塊放在該空閒空間。讀入的資料被放置在LRU列表的某個位置,如果搜尋了一定的
資料緩衝空間,還沒有找到合適的空間,oracle將會啟動DBWR將寫入列表中的髒數
據寫入磁碟資料檔案中。清理出的空閒空間被放置在LRU列表中,oracle會再次尋找
空閒,以找到合適的空閒緩衝塊。

足夠放下被訪問的資料的空間。

oracle中的資料緩衝區是比較複雜的記憶體結構:
預設池(default pool):在預設情況下資料檔案讀取的資料就儲存在該區。
對於的初始化引數為:db_cache_size,一般情況下設定預設池就可以滿足需求。
SQL> show parameter db_cache_size;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_cache_size                        big integer 160M

保持池(keep pool):用於儲存那些頻繁訪問但是不是最熱的資料塊。對於的初
始化引數為buffer_pool_keep
SQL> show parameter buffer_pool_keep;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
buffer_pool_keep                     string    
該資料庫尚未使用keep pool

回收池(recycle pool):用於儲存那些不希望長期儲存在資料緩衝區的資料,儘快的換出
快取區。對於初始化引數:buffer_pool_recycle.
SQL> show parameter buffer_pool_recycle;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
buffer_pool_recycle                  string      
該資料庫尚未使用recycle pool。

物件被載入到哪一個緩衝池是由物件的儲存型別決定的。可以透過storage子句指定儲存
引數,指定物件載入的緩衝池型別。

SQL> create table test_table(id char(5)) storage (buffer_pool keep);
Table created
SQL> alter table test_table storage (buffer_pool recycle);
Table altered
如果不指定buffer_pool 引數預設物件載入的時候是儲存在default池中的。

SQL> alter system set db_keep_cache_size=8m;
System altered
設定keep pool為8mb,設定引數為db_keep_cache_size
SQL> alter system set db_recycle_cache_size=8m;
System altered
設定recycle pool為8mb,設定引數為db_recycle_cache_size
SQL> select component,current_size
  2  from V$sga_dynamic_components;
COMPONENT                                                        CURRENT_SIZE
---------------------------------------------------------------- ------------
shared pool                                                         188743680
large pool                                                           62914560
java pool                                                            54525952
streams pool                                                                0
DEFAULT buffer cache                                                167772160
KEEP buffer cache                                                     8388608
RECYCLE buffer cache                                                  8388608
DEFAULT 2K buffer cache                                                     0
DEFAULT 4K buffer cache                                                     0
DEFAULT 8K buffer cache                                                     0
DEFAULT 16K buffer cache                                                    0
DEFAULT 32K buffer cache                                                    0
Shared IO Pool                                                              0
ASM Buffer Cache                                                            0
檢視設定結果

oracle的緩衝區結構是為了把適當的物件儲存在適當的池中。這是對緩衝區
功能的一種細分。緩衝區中的各個子區之間的記憶體是不能夠共享的,例如分
配給預設池的記憶體只能預設池使用。其他池亦然如此。並且各自子池要設定
合理,以便池中的記憶體空間足夠大,能夠快取需要載入的物件一般情況下不
需要對緩衝區進行如此的細分,僅設定預設池就可以滿足需求了。

從oracle9i開始支援非標準資料庫,oracle9i以前資料庫中所以的資料塊大小是相同的
由引數db_block_size確定。oracle9i開始允許在建立表空間的時候指定非標準資料塊
以便靈活的儲存和管理資料。
相應的資料緩衝區中要有相應的地方存放這些非標準的塊。default池,keep池,recycle池
都只能儲存預設的標準資料塊。在oracle中透過以下引數設定不同塊大小的使用的緩衝區:
db_2k_cache_size:為2kb的資料塊指定緩衝區大小
db_4k_cache_size:為4kb的資料塊指定緩衝區大小
db_8k_cache_size:為8kb的資料塊指定緩衝區大小
db_16k_cache_size:為16kb的資料塊指定緩衝區大小
db_32k_cache_size:為32kb的資料塊指定緩衝區大小

和db_block_size大小相同的資料庫引數不需要設定。
SQL> show parameter db_block_size;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_block_size                        integer     8192
檢視該資料標準塊大小
SQL> alter system set db_16k_cache_size=12m;
System altered
 為16kb的資料塊指定緩衝區大小
SQL> select component,current_size
  2  from v$sga_dynamic_components;
COMPONENT                                                        CURRENT_SIZE
---------------------------------------------------------------- ------------
shared pool                                                         188743680
large pool                                                           62914560
java pool                                                            54525952
streams pool                                                                0
DEFAULT buffer cache                                                167772160
KEEP buffer cache                                                     8388608
RECYCLE buffer cache                                                  8388608
DEFAULT 2K buffer cache                                                     0
DEFAULT 4K buffer cache                                                     0
DEFAULT 8K buffer cache                                                     0
DEFAULT 16K buffer cache                                             12582912
DEFAULT 32K buffer cache                                                    0
Shared IO Pool                                                              0
ASM Buffer Cache                                                            0
確定設定結果。
SQL> create tablespace test datafile 'e:\oracle\testing.dbf' size 10m
  2  blocksize 16k;
Tablespace create
建立16kb的非標準資料塊表空間。
注意:必須先設定資料緩衝區中相應的非標準資料塊的緩衝區大小,才能建立相應的非
標準資料塊表空間。否則會報錯。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26110315/viewspace-715720/,如需轉載,請註明出處,否則將追究法律責任。

相關文章