Oracle記憶體分配與使用(zt)
參考:
總則和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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [20210126]探究oracle記憶體分配.txtOracle記憶體
- 垃圾收集器與記憶體分配策略_記憶體分配策略記憶體
- 記憶體的分配與釋放,記憶體洩漏記憶體
- [20210126]探究oracle記憶體分配3.txtOracle記憶體
- [20210126]探究oracle記憶體分配4.txtOracle記憶體
- JVM GC 與 記憶體分配策略JVMGC記憶體
- JVM 之 記憶體分配與回收策略JVM記憶體
- Java記憶體區域與分配策略Java記憶體
- 垃圾收集機制與記憶體分配策略記憶體
- JVM——垃圾收集器與記憶體分配JVM記憶體
- 垃圾回收與記憶體分配——總結篇記憶體
- 淺談JVM記憶體分配與垃圾回收JVM記憶體
- 垃圾收集器與記憶體分配策略記憶體
- 動態記憶體分配記憶體
- JVM 垃圾收集器與記憶體分配策略JVM記憶體
- JVM垃圾回收器、記憶體分配與回收策略JVM記憶體
- JVM讀書筆記之垃圾收集與記憶體分配JVM筆記記憶體
- java-方法記憶體分配Java記憶體
- go記憶體分配器Go記憶體
- java基礎-記憶體分配Java記憶體
- hadoop 記憶體分配規則Hadoop記憶體
- C語言-記憶體分配C語言記憶體
- 記憶體分配策略學習記憶體
- 深度理解glibc記憶體分配記憶體
- linux記憶體管理(一)實體記憶體的組織和記憶體分配Linux記憶體
- Java虛擬機器記憶體分配與回收策略Java虛擬機記憶體
- JVM(3)-垃圾收集器與記憶體分配策略JVM記憶體
- Android系統Bitmap記憶體分配原理與優化Android記憶體優化
- JVM-垃圾收集器與記憶體分配策略JVM記憶體
- 【記憶體管理】Oracle如何使用ASMM自動共享記憶體管理記憶體OracleASM
- 【Java】 記憶體分配全面淺析Java記憶體
- C++動態記憶體分配C++記憶體
- 記憶體分配問題處理記憶體
- mimalloc記憶體分配程式碼分析記憶體
- C語言的記憶體分配C語言記憶體
- C中的記憶體分配模型記憶體模型
- Python如何管理記憶體?記憶體分配機制是什麼?Python記憶體
- jvm:記憶體模型、記憶體分配及GC垃圾回收機制JVM記憶體模型GC
- C++ 動態記憶體分配與名稱空間C++記憶體