Oracle的内存分配和使用
Oracle数据库在系统占用的内存分为两个部分:SGA和PGA。如何设置和规划Oracle的内存分配一直以来是一个广为争论的话题。
在Oracle9i之前,PGA的内存使用估算一直比较复杂;从Oracle 9i开始,Oracle的自动PGA管理新特性使得Oracle的内存规划得以简化。
根据Oracle的建议,Oracle最多可以使用80%的物理内存,其余20%保留给操作系统使用,在这80%的内存中,对于OLTP系统,Oracle建议分配20%给PGA使用;对于DSS系统,可以分配50%给PGA使用,再引述一下前文的等式:
·对于OLTP系统,PGA_AGGREGATE_TARGET=(<Total Physical Memory>*80%)*20%;
·对于DSS系统,PGA_AGGREGATE_TARGET=(<Total Physical Memory>*80%)*50%。
进一步归纳一下就是:
SGA+PGA <=Total Physical Memory>*80%
也就是:
SGA_MAX_SIZE+PGA_AGGREGATE_TARGET <= <Total Physical Memory>*80%
现在Oracle Database 11g引入了自动内存管理,这个公式得以进一步简化:
MEMORY_TARGET <= MEMORY_MAX_TARGET <= <Total Physical Memory>*80%
这是一个可以参考的数值,在为Oracle规划内存使用时,我们必须清楚,如果Oracle耗用的内存过高,甚至超过了系统的物理内存,那么系统的性能就会受到严重的影响,当系统执行任务时,如果没有足够的内存,那么系统就会进行分页或交换,以完成当前活动事务。
当系统执行分页时,会将当前没有使用的信息从内存转移到硬盘上,这样就可以为当前需要内存的程序分配内存。如果频繁发生分页,系统性能就会严重降低,从而导致很多程序的执行时间变长。
当系统执行交换时,会将某些进程所分配的不活跃内存页(根据LRU算法)从内存转移到硬盘上,这样另一个活动进程就可以得到所需要的内存。交换基于系统循环时间。如果交换太过频繁,系统甚至会出现宕机。
SGA 的参数设置原则
1、SGA_MAX_SIZE:尽量不要超过物理内存大小,否则将会使用到硬盘上的虚拟内存,反而导致性能低下。如果 SGA_MAX_SIZE 之设定值小于其它 SGA 相关参数设定值的总和,或是小于各相关参数默认值的总和,则 SGA_MAX_SIZE 之设定值无效。
2、shared_pool_size:建议在150M-500M之间。如果系统内存为1G,该值可设为150M-200M;如果为2G,该值设为250M-300M;每增加1G内存,该值增加100M;但该值最大不应超过500M。
3、log_buffer:重做日志缓冲区建议设为2M,太大没有意义。
4、Large pool:用于MTS、并行查询和RMAN。如果使用了MTS或RMAN,large_pool特别有用,它可以降低用户对share pool的争用。如果应用系统不使用MTS,也不使用RMAN,large_pool_size的大小可设为1M。否则设为16MB。
5、Java pool:Oracle8I以后,oracle数据库内置了对java的支持,如果数据库安装时选择了JServer组件,则这个值可以设置为20M-30M之间。可以查询v$option动态视图,如果java那一项值为true,则表示安装了JServer,为false,表示未安装。如果应用系统不使用PORTAL,APPS,也不使用RMAN,Java pool值的大小可设为1M。如果系统需要安装补丁,建议先把Java pool值的大小临时增加到50-150M。
以上参数的设定值均为SGA在内存自动管理下中各个pool的最小值,即无论SGA的内存如何分配,也不会低于该值,单位都byte
参考至:http://vb118.blog.163.com/blog/static/173933100201142531527355/
http://www.dbtan.com/2009/11/oracle-memory-allocation-and-use.html
本文原创,转载请注明出处、作者
如有错误,欢迎指正
邮箱:czmcj@163.com