Oracle記憶體分配與使用(zt)

tolywang發表於2005-02-24

參考:

總則和BUFFER CACHE 


理解記憶體分配問題:

動態改變大小:
shared pool, large pool, java pool, and buffer cache 都是以granules為單位分配的。Granules取決與OS,比如32位NT,the granule size is 8 MB for SGAs larger than 128 MB,小於是4m,即即使指定1k,也會分配4m。
檢視V$SGA_DYNAMIC_COMPONENTS獲得各種buffer 的資訊。

SGA_MAX_SIZE 引數:
預設是實際使用的SGA的和。可以設定成比SGA的和大一些,這樣可以方便動態地增加cache size,而不用先要降低其他的cache

改變或增加應用,應該適當的調整oracle 記憶體結構以滿足。

OS記憶體使用:
減少paging,paging是指將貯存在記憶體中的page轉移到disk而使得新的page進入記憶體,會降低效能。可以增大記憶體,或者減少記憶體使用。
將SGA保持在記憶體中。LOCK_SGA引數將sga報留在實體記憶體中,防止被page out

~~~~~~~~~~~~~~~~~

配置和使用buffer cache

透過以下兩種方式調整大小:
V$DB_CACHE_ADVICE / buffer cache hit ratio
1) V$DB_CACHE_ADVICE:
當DB_CACHE_ADVICE=on 時有效。列出各種估計的cache size 和對應的物理讀。Size_FACTOR=1表示當前大小。
SELECT size_for_estimate, buffers_for_estimate, estd_physical_read_factor, estd_physical_reads
   FROM V$DB_CACHE_ADVICE
   WHERE name          = 'DEFAULT'
     AND block_size    = (SELECT value FROM V$PARAMETER WHERE name = 'db_block_size')
     AND advice_status = 'ON';

2) buffer cache hit ratio
低ratio並不能暗示增加cache size可以提高效能。高ratio有時反而會讓你誤認為cache size已經足夠大而滿足要求了。比如:重複的掃描一些大表或索引。因為大表的全表掃描往往都是物理讀,會人為的降低hit ratio。檢查並最佳化buffer get 較大的sql,Cache 一些經常訪問的資料。
Db_cache_size 是針對預設的db_block_size的,對於非標準的block,要特別指定DB_nK_CACHE_SIZE 引數。

考慮Multiple Buffer Pools:
通常只使用default buffer pool就能滿足應用。KEEP buffer pool 用來支援經常訪問的segment。RECYCLE buffer pool用於不經常的大batch jobs,以防止其不必要的cache消耗。他們都使用LRU規則。透過V$BUFFER_POOL 得到各種pool 資訊。
 訪問大segment的時候可以考慮:
1、 如果是索引,檢查其是否selective,否則最佳化sql
2、 如果已經最佳化,則可以將其放入recycle cache中,這樣就不會影響其他的segment。
3、 或者將一些小的熱segment放入keep cache 中,這樣可以減少cache buffer miss ratio

KEPP POOL:
如果應用中有的segment (比如小表)經常被訪問,所以希望其長期保留在buffer中不被因某種因素ageout,可以將其儲存在keep pool中。給KP分配記憶體,需要設定DB_KEEP_CACHE_SIZE引數,是獨立於default buffer的。
大小取決於你想keep的segment,可以透過V$BH檢視segment所佔用的buffer,或者透過DBA_TABLES.BLOCKS and DBA_TABLES.EMPTY_BLOCKS得到used blocks
The NOCACHE(預設值) clause has no effect on a table in the KEEP cache.( alter table t nocache;)
可以改變segment的storage( buffer_pool keep),然後在dba_table.buffer_pool體現:
SQL> alter table t
  2  storage(buffer_pool keep);

RECYCLE Pool:
用於不經常訪問的大segment,不希望其保留在記憶體中,而影響buffer被其他物件使用。
需要設定DB_RECYCLE_CACHE_SIZE,同樣獨立於db_cache_size

------------------------------------------------------------

 

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

相關文章