在自动PGA管理模式下,Oracle使用动态参数PGA_ARRGREATE_TARGET来控制PGA中Work Areas大小的分配。不过,PGA内存的分配是可以超过PGA_ARRGREATE_TARGET设置的值的,原因如下:
1.参数PGA_ARRGREATE_TARGET实际上只作为一个目标,而不是实际的限制。
2.参数PGA_ARRGREATE_TARGET仅仅能够限制那些可调的内存(work areas)。
PGA内存分配过多可能导致服务器内存不足进而产生换页操作,如果发生大量换页,系统将变得响应缓慢性能不稳,如果是RAC还可能引起脑裂。从12c开始,如果遇到这种情况,可以考虑使用PGA_AGGREGATE_LIMIT参数来彻底限制PGA内存的过度分配问题。
参数PGA_AGGREGATE_LIMIT允许你对PGA内存的使用指定一个硬性的限制。如果PGA内存的使用超过了参数设置的值,Oracle会根据下面的顺序中止或终结耗费了大部分不可调节PGA内存的进程或会话:
1.耗费了大部分不可调节PGA内存的会话调用将被中止(注意是会话调用被中止,而不是会话或进程)。
2.在上面的情况被处理后,如果PGA内存仍然超过PGA_AGGREGATE_LIMIT值,则耗费大部分PGA内存的进程和会话将被终止(相当于被kill掉)。
Oracle会将并行执行的查询作为一个整体单位进行处理。
默认情况下,PGA_AGGREGATE_LIMIT参数至少被设置为大于2GB,或者PGA_ARRGREATE_TARGET值的2倍,或者PROCESSES参数值的3倍,三者之中取最大值。无论怎样,它都不应该超过物理内存减去SGA内存大小的120%,该参数的默认值会被记录在alert log中。
无论是否使用自动内存管理,你都可以设置PGA_AGGREGATE_LIMIT,该参数是动态参数,修改后即生效,不需要重启数据库。
PGA_AGGREGATE_LIMIT值可以是K,M,G。设置为0则禁止PGA内存分配的硬限制。
Example:
ALTER SYSTEM SET PGA_AGGREGATE_LIMIT=12G;
以下内容来自我的测试环境,pga_aggregate_target设置为500M,根据上面的算法,500M*2=1000M,300*3=900M。 这两个条件均还没有超过2G,所以pga_aggregate_limit默认值为2G。
SQL> show parameter pga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit big integer 2G
pga_aggregate_target big integer 500M
SQL> show parameter processes
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
processes integer 300
现在我将processes参数扩大至1000,可以看到根据算法pga_aggregate_limit被修改成了3GB。
SQL> alter system set processes=1000 scope=spfile;
System altered.
SQL> startup force
ORACLE instance started.
Total System Global Area 2147483648 bytes
Fixed Size 3712904 bytes
Variable Size 1056966776 bytes
Database Buffers 1073741824 bytes
Redo Buffers 13062144 bytes
Database mounted.
Database opened.
SQL> show parameter processes
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
processes integer 1000
SQL> show parameter pga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit big integer 3000M
pga_aggregate_target big integer 500M
再来看我的另一个测试环境,由于pga_aggregate_target值较大,所以该参数默认被设置成了pga_aggregate_target的2倍大小。
SQL> show parameter pga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit big integer 12880M
pga_aggregate_target big integer 6440M
SQL> show parameter processes
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
processes integer 300
结论就是pga_aggregate_limit参数的默认值取自2G,pga_aggregate_target*2,processes*3这三个值中的最大值。
原文来自
Oracle Database Performance Tuning Guide-->Tuning the Program Global Area-->Limiting the Size of the Program Global Area
1.参数PGA_ARRGREATE_TARGET实际上只作为一个目标,而不是实际的限制。
2.参数PGA_ARRGREATE_TARGET仅仅能够限制那些可调的内存(work areas)。
PGA内存分配过多可能导致服务器内存不足进而产生换页操作,如果发生大量换页,系统将变得响应缓慢性能不稳,如果是RAC还可能引起脑裂。从12c开始,如果遇到这种情况,可以考虑使用PGA_AGGREGATE_LIMIT参数来彻底限制PGA内存的过度分配问题。
参数PGA_AGGREGATE_LIMIT允许你对PGA内存的使用指定一个硬性的限制。如果PGA内存的使用超过了参数设置的值,Oracle会根据下面的顺序中止或终结耗费了大部分不可调节PGA内存的进程或会话:
1.耗费了大部分不可调节PGA内存的会话调用将被中止(注意是会话调用被中止,而不是会话或进程)。
2.在上面的情况被处理后,如果PGA内存仍然超过PGA_AGGREGATE_LIMIT值,则耗费大部分PGA内存的进程和会话将被终止(相当于被kill掉)。
Oracle会将并行执行的查询作为一个整体单位进行处理。
默认情况下,PGA_AGGREGATE_LIMIT参数至少被设置为大于2GB,或者PGA_ARRGREATE_TARGET值的2倍,或者PROCESSES参数值的3倍,三者之中取最大值。无论怎样,它都不应该超过物理内存减去SGA内存大小的120%,该参数的默认值会被记录在alert log中。
无论是否使用自动内存管理,你都可以设置PGA_AGGREGATE_LIMIT,该参数是动态参数,修改后即生效,不需要重启数据库。
PGA_AGGREGATE_LIMIT值可以是K,M,G。设置为0则禁止PGA内存分配的硬限制。
Example:
ALTER SYSTEM SET PGA_AGGREGATE_LIMIT=12G;
以下内容来自我的测试环境,pga_aggregate_target设置为500M,根据上面的算法,500M*2=1000M,300*3=900M。 这两个条件均还没有超过2G,所以pga_aggregate_limit默认值为2G。
SQL> show parameter pga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit big integer 2G
pga_aggregate_target big integer 500M
SQL> show parameter processes
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
processes integer 300
现在我将processes参数扩大至1000,可以看到根据算法pga_aggregate_limit被修改成了3GB。
SQL> alter system set processes=1000 scope=spfile;
System altered.
SQL> startup force
ORACLE instance started.
Total System Global Area 2147483648 bytes
Fixed Size 3712904 bytes
Variable Size 1056966776 bytes
Database Buffers 1073741824 bytes
Redo Buffers 13062144 bytes
Database mounted.
Database opened.
SQL> show parameter processes
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
processes integer 1000
SQL> show parameter pga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit big integer 3000M
pga_aggregate_target big integer 500M
再来看我的另一个测试环境,由于pga_aggregate_target值较大,所以该参数默认被设置成了pga_aggregate_target的2倍大小。
SQL> show parameter pga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit big integer 12880M
pga_aggregate_target big integer 6440M
SQL> show parameter processes
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
processes integer 300
结论就是pga_aggregate_limit参数的默认值取自2G,pga_aggregate_target*2,processes*3这三个值中的最大值。
原文来自
Oracle Database Performance Tuning Guide-->Tuning the Program Global Area-->Limiting the Size of the Program Global Area
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26753337/viewspace-2121957/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26753337/viewspace-2121957/