新博客http://www.cnblogs.com/zhjh256 欢迎访问
分类: Oracle
2007-12-25 22:29:27
·自动共享内存管理增强
在自动共享内存管理启用时,Streams Pool将自动调整。新视图V$SGA_TARGET_ADVICE用于帮助调整SGA_TARGET。
通过设置SGA_TARGET为非0值启用自动共享内存管理,该参数将替代各组件的设置,并且可以自动和动态调整。
使用该功能,STATISTICS_LEVEL必须为ALL/TYPICAL;
SGA_TARGET参数反映了SGA的总大小。自动调整的SGA组件以及相应的参数如下:
Fixed SGA及其他内部分配实例本身需要 N/A
共享池 SHARED_POOL_SIZE
大池 LARGE_POOL_SIZE
JAVA池 JAVA_POOL_SIZE
缓冲缓存 DB_CACHE_SIZE
流池 STREAMS_POOL_SIZE
手工设置的使用SGA_TARGET空间的组件:
日志缓冲 LOG_BUFFER
keep/ recycle缓冲缓存 DB_KEEP_CACHE_SIZE
DB_RECYCLE_CACHE_SIZE
非标准块缓冲缓存 DB_nK_CACHE_SIZE
除了设置SGA_TARGET为0,必须将全部自动调整的SGA组件设置为0以启用全自动调整这些组件的大小。
当然可以设置一个/多个自动调整的SGA组件为非0值,该值将作为在SGA调整期间该组件的最小值。
启用自动共享内存管理的简单方法是使用OEM,EM会自动产生ALTER SYSTEM将SGA_TARGET设置为指定值并且将自动调整的SGA组件设置为0;如果使用SQL*Plus,必须设置SGA_TARGET,然后设置自动调整的SGA组件设置为0或最小值。
例子:
启用自动共享内存管理(从手工管理模式迁移)
1.SELECT (
(SELECT SUM(value) FROM V$SGA) -
(SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY)
) "SGA_TARGET"
FROM DUAL;
2.ALTER SYSTEM SET SGA_TARGET=value [SCOPE={SPFILE|MEMORY|BOTH}]
value可以为第一步的结果或SGA组件之和和SGA_MAX_SIZE(手工模式下有)之间的值。
3.通过ALTER SYSTEM或更改init.ora文件执行以下之一:
设置自动调整的SGA组件设置为0;
设置自动调整的SGA组件设置为最小值;
固定视图V$SGA_DYNAMIC_COMPONENTS和V$SGAINFO显示当前实际的SGA组件的大小。默认情况下自动管理行为最大化系统性能和可用资源;
自动调整和共享池
当自动共享内存管理模式启用时,内部算法尝试根据负载最优化共享内存,由于打开的游标,钉住的PL/SQL包,通常时共享池无法收缩。因此调整算法仅会增加共享池的大小。
动态调整SGA参数
可以通过ALTER SYSTEM动态调整SGA_TARGET及其组件的大小。
·动态更改SGA_TARGET
SGA_TARGET可以最大增加到SGA_MAX_SIZE,如果减少了SGA_TARGET,系统将会自动调整一个/多个组件释放内存。在SGA_TARGET更改是消耗的物理内存总量依赖于具体的OS,在某些UNIX平台下不支持动态共享内存,SGA使用的物理内存为SGA_MAX_SIZE参数的值。在这种OS下,设置SGA_TARGET小于SGA_MAX_SIZE不能得到实际的好处,因此不推荐在这些OS上设置SGA_MAX_SIZE。
在其他平台,如Solaris和Windows上,消耗的物理内存为SGA_TARGET的值。
调整SGA_TARGET时,仅会影响没有设置最小值的自动调整组件,任何手工配置的组件都将保持不变。
当启用自动内存管理时,最好在数据库启动前将SGA_TARGET设置为非0。由于共享池不可收缩特征,动态更改SGA_TARGET从0值到非0值可能达不到预期的结果。启动后可以动态更改SGA_TARGET。
更改自动管理组件的参数
如果设置了组件的大小小于当前值,该组件的值不会立刻生效,新值仅限制算法在将来的最小值。
更改手工管理组件的参数
手工管理组件的参数也可以动态更改,并且其值声明精确值而非最小值。增加其值时,会从自动调整组件中抽取。
·使用手工共享内存管理(非10.2新功能)
如果没有设置SGA_TARGET启用自动共享内存管理,则必须手工配置每个SGA组件。
设置缓冲缓存初始化参数
可以为各种不同的块声明缓存大小,这些初始化参数都是动态的。数据库会为DB_CACHE_SIZE设置恰当的值,但是DB_nK_CACHE_SIZE默认为0,没有配置额外的非标准块缓存。缓冲缓存的大小会影响性能,较大的缓存尺寸通常能够减少物理读和写。但是过大的缓存会使用大量的内存并引起交换和内存换页。
DB_CACHE_SIZE
DB_CACHE_SIZE声明的值决定了标准块的数量,因此为了确定DB_CACHE_SIZE,必须决定使用的缓冲数据并且乘以DB_BLOCK_SIZE。
声明共享池的大小
SHARED_POOL_SIZE动态初始化参数用来设置SGA组件共享池的大小,Oracle默认选择恰当的值。
Oracle Database 10g Release 1以前,分配的共享池大小等于SHARED_POOL_SIZE+Startup overhead in Shared Pool,即使SHARED_POOL_SIZE显示为没有加上启动负载的值。
Oracle Database 10g Release 1开始,分配的共享池大小等于SHARED_POOL_SIZE,这个参数中包含了Startup overhead in Shared Pool。
在手工管理模式下,如果SHARED_POOL_SIZE的值太小以至于无法容纳内部SGA的需求,那么将发生ORA-371错误并提供建议值。
在自动管理模式下,共享池会自动调整并且ORA-371错误将被抑制。
声明大池
LARGE_POOL_SIZE动态可选设置大池的尺寸。
声明JAVA池
JAVA_POOL_SIZE初始化参数动态设置JAVA池的大小。Oracle默认选择恰当的值。
声明Streams Pool大小
如果STREAMS_POOL_SIZE为0,当Oracle需要内存时将从缓冲缓存抽取。
查看SGA信息的视图
V$SGA:显示SGA的概要信息;
V$SGAINFO:显示详细信息;
V$SGASTAT:显示详细信息;
V$SGA_DYNAMIC_COMPONENTS:显示动态SGA组件的信息,该视图基于调整完成的SGA操作;
V$SGA_DYNAMIC_FREE_MEMORY:显示SGA可供将来调整使用的空闲内存大小;
V$SGA_RESIZE_OPS:显示最近的400次SGA调整操作的信息;
V$SGA_CURRENT_RESIZE_OPS:显示当前正在调整的SGA操作;
V$SGA_TARGET_ADVICE:帮助调整SGA_TARGET;