1. 什么是PGA?
Roger--001<oracledba@live.cn&get;20:36:21
PGA,即Program Global Area 的简称,是一块包含一个服务进程的数据和控制信息的内存区域。 注意,PGA的内存结构是不需要Latch来进行保护的。
Oracle 在实例启动时就开始进行分配,一个 Oracle 进程拥有一个 PGA 内存区。一个 PGA 也只能被拥有它的那个服务进程所访问,且只有这个进程
中的 Oracle 代码才能访问它,和其他进程的pga区域是相互独立的,互不影响。
PGA不需要latch 保护,是私有的
PGA用多少,分配多少
2. PGA的设置技巧
在Oracle 10g之前,PGA的大小通过参数pga_aggregate_target 来进行控制,如下:
SQL&get; parameter pga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 209715200
pga_aggregate_target big integer 16777216
且pga的大小受限于_pga_max_size参数的控制,不能超过该参数的设置。
SQL&get; show parameter _realfree_heap_pagesize_hint
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_realfree_heap_pagesize_hint big integer 64K
内存页
单个进程 PGA最大4G
PGA 分配单位chunk
----pga dump
SQL&get; conn /as sysdba
Connected.
SQL&get; oradebug setmypid
Statement processed.
SQL&get; ALTER SESSION SET EVENTS 'immediate trace name heapdump level 1';
Session altered.
SQL&get; oradebug close_Trace
Statement processed.
SQL&get; oradebug tracefile_name
/home/ora10g/admin/roger/udump/roger_ora_3584.trc
对于PGA的dump 不做过多的描述,这个意义不大。 我们知道PGA 其实主要由3部分组成(准确的说是PGA的可变区域部分):
1 )私有 SQL 区;
2 )游标和 SQL 区
3 )会话内存
从这个我们不难看出,PGA中最重要的地方无非是SQL区域。
optimal: 即SQL语句能够完全在所分配的SQL工作区内存完成所有的操作。当然这种情况其性能肯定是最优的。
onepass: SQL语句需要和disk上的temp表空间交互一次才能完成所有的操作。
multipass: 通常是由于SQL工作区偏小,从而导致SQL语句需要和disk上的temp 表空间交互多次才能完成所有操作,这种情况下性能无疑是最差的。
对于串行操作:
假设PGA <=500MB,则_smm_max_size = 20%*PGA
如果PGA在500MB和1000MB之间,_smm_max_size = 100MB
如果PGA在1001MB和2569MB之间,_smm_max_size = 10%*PGA
如果PGA>2560MB,则_smm_max_size = 262,060MB
对于并行操作,能够使用的PGA内存按照以下原则分配:
50%* PGA/DOP
但是注意,当DOP<=5时,_smm_max_size限制生效,并行度超过5的时候,则受另外一个数据库隐含参数_smm_px_max_size的影响