ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle内存分配与使用(zt)

Oracle内存分配与使用(zt)

原创 Linux操作系统 作者:tolywang 时间:2005-02-24 00:00:00 0 删除 编辑

参考:
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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle , MySQL, SAP IQ, SAP HANA, PostgreSQL, Tableau 技术讨论,希望在这里一起分享知识,讨论技术,畅谈人生 。

注册时间:2007-12-10

  • 博文量
    5595
  • 访问量
    13302057