SGA概述

Oracle的SGA包括以下几个部分,可以通过show sga命令或者是通过查看v$sga视图来查看SGA的大概组成:

SQL> show sga Total System Global Area 1048576000 bytes Fixed Size 1223392 bytes Variable Size 847250720 bytes Database Buffers 192937984 bytes Redo Buffers 7163904 bytes 17:42:05 SQL> select * from v$sga; NAME VALUE ------------------------------ ------------- Fixed Size 1223392.00 Variable Size 847250720.00 Database Buffers 192937984.00 Redo Buffers 7163904.00

从上面可以大致的看到sga包括一个固定区,一个可变区,一个数据库缓存和一个redo缓存。这些是比较笼统的信息,具体的SGA是由以下几个部分组成的:

- 数据缓冲(Buffer Cache)

- 共享池(Shared Pool)

- 大池(Large Pool)

- Java池(Java Pool)

- 流池(Streams Pool --- 10g以后才有)

- 重做日志缓冲(Redo Log Buffer)

- 其他buffer caches(如KEEP, RECYCLE, and other block sizes cache等)

- Fixed SGA and other internal allocations。

其中,Shared Pool、Java Pool、Large Pool和Streams Pool这几块内存区的大小是相应系统参数设置而改变的,所以有通称为可变SGA(Variable SGA)。最后一个fixed sga部分,一般是在实例启动以后就固定在sga中了,是不会发生变化的,这个部分的区域一般小于100k。

理解了SGA的组成以后,下面就来解释一下有关设置SGA大小的两个参数SGA_MAX_SIZE和SGA_TARGET的含义。


SGA_MAX_SIZE

这个参数顾名思义,它用来控制SGA使用虚拟内存的最大大小,这里的虚拟内存的含义可能会有所模糊,先可以这样理解,就是Oracle所能在内存中给SGA分配的最大大小。

从这个版本来看,这里似乎并没有发生改变。那说明是什么问题呢?很显然,SGA_MAX_SIZE仍然表示SGA的大小的上限值,而SGA_TARGET是SGA的所有组件的大小的最大值之和,即当SGA_TARGET< SGA_MAX_SIZE的时候,oracle就会忽略SGA_MAX_SIZE的值,SGA_TARGET也就成了SGA的在此实例中的上限制,它能动态改变大小,但是不能够大于SGA_MAX_SIZE的值。

有人曾经做过试验,在某些版本中(可能在我的版本之后的版本),当SGA_TARGET < SGA_MAX_SIZE时,实例重启以后SGA_MAX_SIZE就变成SGA_TARGET的大小了。

那么这就说明SGA_TARGET的处理,在不同的版本中是不一样的。


总结:在11g中,这个SGA_TARGET只能设置是等于SGA_MAX_SIZE的大小了,设置比它小,oracle会自动帮你调整,设置比它大,那还是出错。现在可以自己想想,oracle对SGA_TARGET的大小处理在往正确的简单的方向前进中。

SGA_TARGET带来一个重要的好处就是,能使SGA的利用率达到最佳,从而节省内存成本。因为ASMM启动后,Oracle会自动根据需要调整各个区域的大小,大大减少了某些区域内存紧张,而某些区域又有内存空闲的矛盾情况出现。

觉得有用的走波关注哦!

oracle中imp命令详解(oracle参数深入解析SGAMAX)(1)

,