配置和使用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体现:
查看oracle缓存的命中率(大于90%)
select 1 - ((physical.value - direct.value - lobs.value) / logical.value)
"Buffer Cache Hit Ratio"
from v$sysstat physical,v$sysstat direct,v$sysstat lobs,v$sysstat logical
where physical.name = 'physical reads'
and direct.name='physical reads direct'
and lobs.name='physical reads direct (lob)'
and logical.name='session logical reads';
通过以下两种方式调整大小:
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体现:
查看oracle缓存的命中率(大于90%)
select 1 - ((physical.value - direct.value - lobs.value) / logical.value)
"Buffer Cache Hit Ratio"
from v$sysstat physical,v$sysstat direct,v$sysstat lobs,v$sysstat logical
where physical.name = 'physical reads'
and direct.name='physical reads direct'
and lobs.name='physical reads direct (lob)'
and logical.name='session logical reads';
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/110321/viewspace-628334/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/110321/viewspace-628334/
本文介绍如何通过调整Oracle的buffer cache来提升数据库性能。包括使用V$DB_CACHE_ADVICE监控缓存建议,理解hit ratio的意义,合理配置不同类型的buffer pool如KEEP和RECYCLE pool,并提供查询语句来评估缓存效率。
1万+

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



