作者:dbtan |【转载时请以超链接形式标明文章出处作者信息】


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算法)从内存转移到硬盘上,这样另一个活动进程就可以得到所需要的内存。交换基于系统循环时间。如果交换太过频繁,系统甚至会出现宕机。

- The End -