系统内存
SGA_MAX_SIZE值
1G
400-500M
2G
1G
4G
2500M
8G
5G
2.6 PRE_PAGE_SGA oracle实例启动时,会只载入各个内存区最小的大小。而其他SGA内存只作为虚拟内存分配, 只有当进程touch到相应的页时,才会置换到物理内存中。但我们也许希望实例一启动后,所有SGA 都分配到物理内存。这时就可以通过设置PRE_PAGE_SGA参数来达到目的了。这个参数的默认值 为FALSE,即不将全部SGA置入物理内存中。当设置为TRUE时,实例启动会将全部SGA置入物理 内存中。它可以使实例启动达到它的最大性能状态,但是,启动时间也会更长(因为为了使所有SGA 都置入物理内存中,oracle进程需要touch所有的SGA页)。 2.7 LOCK_SGA 为了保证SGA都被锁定在物理内存中,而不必页入/页出,可以通过参数LOCK_SGA来控制。 这个参数默认值为FALSE,当指定为TRUE时,可以将全部SGA都锁定在物理内存中。当然, 有些系统不支持内存锁定,这个参数也就无效了。 2.8 SGA_TARGET 这里要介绍的时Oracle10g中引入的一个非常重要的参数。在10g之前,SGA的各个内存区 的大小都需要通过各自的参数指定,并且都无法超过参数指定大小的值,尽管他们之和可能并 没有达到SGA的最大限制。此外,一旦分配后,各个区的内存只能给本区使用,相互之间是不能共享的。 拿SGA中两个最重要的内存区Buffer Cache和Shared Pool来说,它们两个对实例的性能影响最大, 但是就有这样的矛盾存在:在内存资源有限的情况下,某些时候数据被cache的需求非常大, 为了提高buffer hit,就需要增加Buffer Cache,但由于SGA有限,只能从其他区“抢”过来——如缩小Shared Pool, 增加Buffer Cache;而有时又有大块的PLSQL代码被解析驻入内存中,导致Shared Pool不足, 甚至出现4031错误,又需要扩大Shared Pool,这时可能又需要人为干预,从Buffer Cache中将内存夺回来。 有了这个新的特性后,SGA中的这种内存矛盾就迎刃而解了。这一特性被称为自动共享内存管理 (Automatic Shared Memory Management ASMM)。而控制这一特性的,也就仅仅是这一个参数SGA_TARGE。 设置这个参数后,你就不需要为每个内存区来指定大小了。SGA_TARGET指定了SGA可以使用的最大内存大小, 而SGA中各个内存的大小由Oracle自行控制,不需要人为指定。Oracle可以随时调节各个区域的大小,使之达到系 统性能最佳状态的个最合理大小,并且控制他们之和在SGA_TARGET指定的值之内。一旦给SGA_TARGET指定值后 (默认为0,即没有启动ASMM),就自动启动了ASMM特性。 三、oracle 内存调优办法 当项目的生产环境出现性能问题,我们如何通过判断那些参数需要调整呢? 3.1 检查ORACLE实例的Library Cache命中率: 标准:一般是大于99% 检查方式:select 1-(sum(reloads)/sum(pins)) "Library cache Hit Ratio" from v$librarycache; 处理措施: 如果Library cache Hit Ratio的值低于99%,应调高shared_pool_size的大小。通过sqlplus连接数据库执行如下命令,调整shared_pool_size的大小: SQL>alter system flush shared_pool; SQL>alter system set shared_pool_size=设定值 scope=spfile; 3.2 检查ORACLE实例的Data Buffer(数据缓冲区)命中率: 标准:一般是大于90% 检查方式: select 1 - (phy.value / (cur.value + con.value)) "HIT RATIO" from v$sysstat cur, v$sysstat con, v$sysstat phy where cur.name = 'db block gets' and con.name = 'consistent gets' and phy.name = 'physical reads'; 处理措施: 如果HIT RATIO的值低于90%,应调高db_cache_size的大小。通过sqlplus连接数据库执行如下命令, 调整db_cache_size的大小 SQL>alter system set db_cache_size=设定值 scope=spfile 3.3 检查ORACLE实例的Dictionary Cache命中率: 标准:一般是大于95% 检查方式: select 1 - (sum(getmisses) / sum(gets)) "Data Dictionary Hit Ratio" from v$rowcache; 处理措施: 如果Data Dictionary Hit Ratio的值低于95%,应调高shared_pool_size的大小。通过sqlplus连接数据库执行如下命令,调整shared_pool_size的大小: SQL>alter system flush shared_pool; SQL>alter system set shared_pool_size=设定值 scope=spfile; 3.4 检查ORACLE实例的Log Buffer命中率: 标准:一般是小于1% 检查方式: select (req.value * 5000) / entries.value "Ratio" from v$sysstat req, v$sysstat entries where req.name = 'redo log space requests' and entries.name = 'redo entries'; 处理措施: 如果Ratio高于1%,应调高log_buffer的大小。通过sqlplus连接数据库执行如下命令,调整log_buffer的大小: SQL>alter system set log_buffer=设定值 scope=spfile; 3.5 检查undo_retention: 标准:undo_retention 的值必须大于max(maxquerylen)的值 检查方式: col undo_retention format a30 select value "undo_retention" from v$parameter where name='undo_retention'; select max(maxquerylen) From v$undostat Where begin_time>sysdate-(1/4); 处理措施: 如果不满足要求,需要调高undo_retention 的值。通过sqlplus 连接数据库执行如下命 令,调整undo_retention 的大小: SQL>alter system set undo_retention= 设定值 scope=spfile; 注: 32bit 和 64bit 的问题 对于 oracle 来说,存在着 32bit 与 64bit 的问题。这个问题影响到的主要是 SGA 的大小。在 32bit 的数据库下,通常 oracle 只能使用不超过 1.7G 的内存,即使我们拥有 12G 的内存,但是我们却只能使用 1.7G,这是一个莫大的遗憾。假如我们安装 64bit 的数据库,我们就可以使用很大的内存,我们几乎不可能达到上限。但是 64bit 的数据库必须安装在 64bit 的操作系统上,可惜目前 windows 上只能安装 32bit 的数据库,我们通过下面的方式可以查看数据库是 32bit 还是 64bit 但是在特定的操作系统下,可能提供了一定的手段,使得我们可以使用超过 1.7G 的内存,达到 2G 以上甚至更多。