日期:2014-05-16  浏览次数:20479 次

oracle 内存分配(转)
转自:http://hi.baidu.com/andow2008/blog/item/d5ddf4b52651b27b8ad4b20a.html

配置 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


配置和使用Shared Pool and Large Pool

包括PL/SQL blocks and SQL,dictionary cache data和其他。正确配置的好处在于:
1、 避免SQL重复parse,减少CPU资源使用
2、 减少latch资源争用
3、 减少IO,因为dictionary elements避免了访问磁盘

Shared Pool Concepts
包括library cache 和dictionary cache,根据需要自动增加或减少。
  library cache包括parsed or compiled的PL/SQL blocks 和 SQL以及JAVA类。v$librarycache
  dictionary cache 存放了来自 data dictionary的数据。比如usernames, segment information, profile data, tablespace information, and sequence numbers等,在解析和编译SQL时引用.
  Shared Pool 的cache miss开销比buffer cache的大很多,所以要谨慎设置。
  共享池内存分配以chunks(大块)为单位,这样允许大对象(5K)直接CACHE到内存中,而不需要申请一段连续的空间,这样可以减少碎片带来的空间浪费.
  reserved pool:Shared Pool隔离出来的一小段,用来存放大于5k的大对象.

Hard / soft parse:
  Soft parse使用的资源包括CPU 和library cache latch gets
  Hard parse是指要解析的SQL没有在library cache中,或者执行的时候发现解析过的SQL已经aged out,就是离开了library cache,称为Library cache misses.使用的资源包括额外的CPU, library cache latch gets, 以及shared pool latch gets.

Using the Shared Pool Effectively
  Shared Cursors
  SQL中尽量指定表的owner,而不使用public synonyms.,可以significantly reduces the number of entries in the dictionary cache.令一种方法是使用同样的USERID访问数据库.尽量使用存储过程.
  避免在高峰时期执行DDL,因为这样会使相关连的SQL失效,要重新编译.
  Cache Sequence Numbers可以减少dictionary cache locks,比如:ALTER SEQUENCE customers_seq CACHE 5; 事先cache 5个.2~28

Siz