SGA是一组包含着一个Oracle实例的数据和控制信息的共享内存结构:
1.是为oracle系统分配的共享内存;
2.是实例的主要组成部分;
3.是影响数据库性能的最重要因素;
4.随实例启动/关闭而被分配/回收;
5.SGA自动对所包含的各种缓冲自动进行动态管理;
SGA_TARGET
启动自动共享内存管理ASMM机制,由mman(Memory Mannager)后台进程来动态管理SAG中的各项缓存(redo_log_buffer为非动态管理),若值为0,则表示未启动ASMM,其值应尽量的接近sga_max_size。当sga_target小于sag_max_size时,SGA中各项缓存中合计值以sga_target为实际上限值。
Oracle 的SGA 包括以下几个部分,可以通过show sga 命令或者是通过查看v$sga 视图来查看SGA 的大概组成:
17:39:48 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 分配的最大大小 。
现在来解释一下我这里“虚拟内存”的含义,确切的应该这样说:实际内存和虚拟内存。我们知道当OS