有几个影响SGA内存分配数量的参数,除了SGA_MAX_SIZE ,其他都是动态参数,也就是说在数据库运行期间可以使用ALTER SYSTEM 语句动态修改的参数.SGA的大小是动态的,通过修改这些参数可以让SGA增大或缩小.
SGA组件和SGA内存颗粒
由许多内存组件组成,他们是用于满足特定内存分配请求的内存池.例如共享池(用于缓冲磁盘数据块),所有的SAG以一个最小的内存单元颗粒分配和回收内存空间,Oracle在系统内部追踪SAG的内存单元的分配和使用情况.
SGA的内存分配是通过颗粒进行分配的,颗粒大小由SGA的大小决定.一般来将,在大多数平台,如果SGA小于等于1G,那么颗粒大小为4MB,如果大于1G,颗粒的大小为16MB,不同的是在32位Windows平台下,SGA大于1G时,颗粒大小位8MB而非16MB,详细信息,查看操作系统文档.
可以通过V$SGAINFO 系统试图查看由某个实例使用的颗粒大小.同样的大小用于所有SGA的动态组件.
如果指定的SGA组件的大小不是颗粒大小的整数倍,那么Oracle将会四舍五入求整而得到其整数倍值,赋给SGA内存组件.而不是你所指定的大小.例如如果颗粒大小为4MB,你给 DB_CACHE_SIZE 参数设定为10MB,那么实际分配的内存将会是12MB.
限制SGA的大小
SGA_MAX_SIZE 参数指定SGA在实例的生命期内的最大数.动态修改这些参数影响的Buffer cache,shared pool,large pool,java pool,和streams pool的大小,和SGA的总大小.但是不能超过SGA_MAX_SIZE 参数所设定的值.
如果没有指定,那么默认把所有初始化参数中指定的内存组件的和作为期缺省值.
使用自动共享内存管理
通过使用SGA_TARGET参数来启用自动共享内存管理.以前手动分配的类似java_pool,large_pool这样的共享内存组件将被自动管理,另外,你必须确保STATISTICS_LEVEL初始化参数设置为TYPICAL(默认值)或ALL.
SGA_TARGET初始化参数反映了SGA的大小.
表2-3 自动分配大小的SGA组件和相应的参数
SGA 组件 初始化参数
固定的SGA和其他Oracle数据库实例需要的内部分配 不可用
共享池 SHARED_POOL_SIZE
大型池 LARGE_POOL_SIZE
Java池 JAVA_POOL_SIZE
缓冲区高数缓存 DB_CACHE_SIZE
表2-4 手动分配大小的使用SGA_TARGET空间的SGA组件
SGA 组件 初始化参数
日志缓冲区 LOG_BUFFER
The keep and recycle buffer caches DB_KEEP_CACHE_SIZE
DB_RECYCLE_CACHE_SIZE
非标准缓冲区高数缓存块大小 DB_nK_CACHE_SIZE
流池 STREAMS_POOL_SIZE
在手动管理模式下执行如下SQL查询得到SGA_TARGET的值.
SELECT (
(SELECT SUM(value) FROM V$SGA) -
(SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY)
) "SGA_TARGET"
FROM DUAL;
然后你可以删除由Oracle自动管理的共享内存相应的初始化参数.
例如,当前你在手动管理模式下由如下配置,并且SGA_MAX_SIZE 设置为 1200M:
SHARED_POOL_SIZE = 200M
DB_CACHE_SIZE = 500M
LARGE_POOL_SIZE=200M
对其动态性能视图的查询结果如下
SHARED_POOL_SIZE = 200M
DB_CACHE_SIZE = 500M
LARGE_POOL_SIZE=200M
对其相应的动态性能视图查询结果如下:
SELECT SUM(value) FROM V$SGA = 1200M
SELECT CURRENT_VALUE FROM V$SGA_DYNAMIC_FREE_MEMORY = 208M
你可以替换手动分配大小的参数 ( SHARED_POOL_SIZE, DB_CACHE_SIZE, LARGE_POOL_SIZE ) 来发挥自动共享内存管理的优点.
SGA_TARGET=992M
992M 是1200M 减去208M得到的.
By default, when you set a value for SGA_TARGET, the value of the parameters corresponding to all the automatically sized SGA components is set to zero. However, you can still exercise some control over the size of the automatically sized components by specifying minimum values for the parameters corresponding to these components. Doing so can be useful if you know that an application cannot function properly without a minimum amount of memory in specific components. You specify the minimum amount of SGA space for a component by setting a value for its corresponding 初始化参数. Here is an example configuration:
SGA_TARGET = 256M
SHARED_POOL_SIZE = 32M
DB_CACHE_SIZE = 100M
In this example, the shared pool and the default buffer pool will not be sized smaller than the specified values (32 M and 100M, respectively). The remaining 124M (256 minus 132) is available for use by all the manually and automatically sized components.
The actual distribution of values among the SGA components might look like this:
Actual shared pool size = 64M
Actual buffer cache size = 128M
Actual Java pool size = 60M
Actual large pool size = 4M
此参数值决定了SGA的最小分配空间.V$SGA_DYNAMIC_COMPONENTS 显示当前SGA组件的实际大小.你还可以用企业管理器内存配置页查看当前SGA组件的实际值.
SGA参数的动态修改
你可以用ALTER SYSTEM SQL 语句动态修改SGA_TARGET参数和控制SGA内存组件的其他参数的值.在下面的段落种有描述
SGA_TARGET初始化参数的动态修改
SGA_TARGET参数值可以增加到SGA_MAX_SIZE 参数所指定的值,也可以减少,如果减少SGA_TARGET的值,系统将调整共享