参考:
http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96533/memory.htm
总则和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
------------------------------------------------------------
http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96533/memory.htm
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-84296/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/35489/viewspace-84296/
本文围绕Oracle内存结构展开,介绍了内存分配问题,如shared pool等以granules为单位分配,可通过SGA_MAX_SIZE方便动态增加cache size。还阐述了减少OS内存paging的方法。详细说明了配置和使用buffer cache的方式,包括调整大小、考虑多buffer pool等内容。
355

被折叠的 条评论
为什么被折叠?



