PGA概念

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的影响



原文地址:https://www.cnblogs.com/hzcya1995/p/13352009.html