在做sql查询的时候发现在2亿表中查询sql响应时间很慢,遂想修改sga
将出现的问题记录下来ORA-27102: out of memory
(这里需要注意在32位的win2003系统中我的内存是8g,但是分配给sga的最大内存不能超过1.7g,在64位系统可以)
导致出现ORA-27102
数据库启动不了,这里我找了自己的oracle本地home没有传说的spfile,将pfile文件夹中的
init.ora.118201118470文件进行编译启动,在重新打来sqlplus进入实例后
在重新装载
启动成功。
我在修改的时候需要保证sga不能高于1.7g
所以又重新装载了遍
修改成功,数据库能正常访问!
SGA_TARGET:
在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特性。
将出现的问题记录下来ORA-27102: out of memory
SQL> alter system set sga_max_size=5G scope=spfile;
System altered.
(这里需要注意在32位的win2003系统中我的内存是8g,但是分配给sga的最大内存不能超过1.7g,在64位系统可以)
导致出现ORA-27102
SQL> startup force
数据库启动不了,这里我找了自己的oracle本地home没有传说的spfile,将pfile文件夹中的
init.ora.118201118470文件进行编译启动,在重新打来sqlplus进入实例后
SQL> CREATE SPFILE FROM PFILE=\'E:\\ora9i\\admin\\eygle\\pfile\\init.ora\';
创建成功
在重新装载
SQL> startup force
启动成功。
我在修改的时候需要保证sga不能高于1.7g
所以又重新装载了遍
SQL> show parameter sga
NAME TYPE VALUE
------------------------------------ --------------- ------------------------------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 1000M
sga_target big integer 300M
SQL> alter system set sga_max_size=1500m scope=spfile;
SQL> alter system set sga_target=1000m scope=spfile;
SQL> startup force
修改成功,数据库能正常访问!
SGA_TARGET:
在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特性。