PGA(Program Global Area)指的是程序全局区,是用于单数据库服务进程(Server Process)的一块包含数据和控制信息的内存区域。
当用户连接Oracle 数据库实例时,会创建出一个session用于服务进程和客户端间的通讯。每一个服务进程都有自己的PGA。
PGA用于处理SQL语句并且控制登录和其他会话信息。大部分的PGA区域被用于SQL work areas,这个工作区域主要用于SQL的排序或其他操作。
实例是以dedicated server(专用服务)或shared server(共享服务)模式运行,决定了PGA的内存使用总量。
在Oracle中PGA由一系列参数控制:
SQL> show parameter area_size NAME TYPE VALUE ------------------------------------ --------------------------------- ------------------------------ bitmap_merge_area_size integer 1048576 create_bitmap_area_size integer 8388608 hash_area_size integer 131072 sort_area_size integer 65536 workarea_size_policy string AUTO
Oracle为了方便PGA的管理,后续提供了一下中PGA的新管理方法,Automatic PGA Memory Management.通过这种特性,Oracle可以自动调整PGA的内存区,简化DBA的工作。
Oracle为这个新特性引入几个初始化参数:
PGA_AGGREGATE_TARGET 该参数指定所有session总计可以使用的最大PGA内存数,参数可以动态修改,取值范围从10M~(4096G-1)byte。
WORKAREA_SIZE_POLICY 此参数用于开关PGA自动管理功能。该参数有两个值AUTO和MANUAL,默认情况下该参数为开启自动管理功能。
pga_aggregate_target参数同时限制全局PGA和私有工作区内存分配。
对于串行操作,单个SQL操作能够使用PGA按照以下原则分配
MIN(PGA_AGGREGATE_TARGET*5%,100M)
对于并行操作,
(PGA_AGGREGATE_TARGET/dop)*30% dop degree of parallelism 并行度
PGA还分为TUNABLE MEMORY SIZE和UNTUNABLE MEMORY SIZE。而TUNABLE MEMORY SIZE是由SQL工作区使用的,其余区域为UNTUNABLE MEMORY SIZE。
自动PGA启用后,遵循以下规则:
TUNABLE MEMORY SIZE+UNTUNABLE MEMORY SIZE≤PGA_AGGREGATE_TARGET
对于PGA_AGGREGATE_TARGET参数的设置,Oracle提供一个建议方案:
对于OLTP系统
PGA_AGGREGATE_TARGET=(Total Physical Memory*80%)*20%
对于DSS系统
PGA_AGGREGATE_TARGET=(Total Physical Memory*80%)*50%
伴随新功能引入,Oracle同时在V$PROCESS视图中增加了相应的字段记录进程PGA的耗用:
[oracle@021Y-SH-BKAP ~]$ ps -ef | grep ora | head -1 oracle 5191 1 0 Feb21 ? 00:00:41 ora_pmon_orcl SQL> col SPID for a10 SQL> col USERNAME for a10 SQL> select pid,spid,username,pga_used_mem,pga_alloc_mem,pga_freeable_mem,pga_max_mem from v$process where spid='5191'; PID SPID USERNAME PGA_USED_MEM PGA_ALLOC_MEM PGA_FREEABLE_MEM PGA_MAX_MEM ---------- ---------- ---------- ------------ ------------- ---------------- ----------- 2 5191 oracle 694480 778384 0 778384
SQL在工作区内以三种方式执行:
Optimal 指所有处理可以再内存中完成。
Onepass 大部分操作可以再内存中完成,但也需要用到磁盘操作。
Multipass 大量操作产生磁盘交互。
通过以下语句查看数据库中SQL工作的效率
SELECT NAME, VALUE, ROUND(100 * (VALUE / DECODE((SELECT SUM(VALUE) FROM V$SYSSTAT WHERE NAME LIKE 'workarea executions%'), 0, NULL, (SELECT SUM(VALUE) FROM V$SYSSTAT WHERE NAME LIKE 'workarea executions%'))), 3) PCT FROM V$SYSSTAT WHERE NAME LIKE 'workarea executions%'
通过一个实验来观察PGA上限
SQL> alter system set pga_aggregate_target=&N; Enter value for n: 10m old 1: alter system set pga_aggregate_target=&N new 1: alter system set pga_aggregate_target=10m SQL> set line 300 SQL> show parameter pga_aggregate_target NAME TYPE VALUE --------------------- -------------------- --------------pga_aggregate_target big integer 10M SQL> select sql_text,operation_type,policy,last_memory_used/1024/1024 last_memory_used,last_execution,last_tempseg_size from v$sql l,v$sql_workarea a where l.hash_value=a.hash_value and sql_text='select * from dba_objects where rownum<50000'; SQL_TEXT OPERATION_TYPE POLICY LAST_MEMORY_USED LAST_EXECU LAST_TEMPSEG_SIZE -------------------------------------------------- -------------------- ---------- ---------------- ---------- ----------------- select * from dba_objects where rownum<50000 HASH-JOIN AUTO 1.27246094 OPTIMAL select * from dba_objects where rownum<50000 HASH-JOIN AUTO 1.23632813 OPTIMAL SQL> col name for a40 SQL> select name,value/1024/1024 MB from v$pgastat where name in('aggregate PGA target parameter','global memory bound'); NAME MB ---------------------------------------- ---------- aggregate PGA target parameter 2560 global memory bound 10
这个书中的实验我尝试在11G下做,但发现无论是修改隐藏参数还是修改动态参数,都无法改变视图v$pgastat 中的值。不知道PGA 大小是受什么限制的
SQL> @?/getparDescr.sql Enter value for get_parameters:pga NAME TYPE VALUE VALUE DEFAULTS DESCRIBE KSPPIHASH -------------------- ---------- --------------- --------------- --------------------------- ------------------------------ ---------- __pga_aggregate_targ 6 10485760 10M FALSE Current target size for the ag 1017923387 gregate PGA memory consumed _pga_max_size 6 20971520 20M FALSE Maximum size of the PGA memory 2337595655 for one process SQL> show parameter pga NAME TYPE VALUE ------------------------ ------------------- ------------- _pga_max_size big integer 20M pga_aggregate_target big integer 10M
对于
SQL> @?/getparDescr.sql Enter value for get_parameters: smm old 10: and ksppinm like '%&get_parameters%' new 10: and ksppinm like '%smm%' NAME TYPE VALUE VALUE DEFAULTS DESCRIBE KSPPIHASH -------------------- ---------- --------------- --------------- --------------------------- ------------------------------ ---------- _smm_auto_min_io_siz 3 56 56 TRUE Minimum IO size (in KB) used b 23088013 e y sort/hash-join in auto mode _smm_auto_max_io_siz 3 248 248 TRUE Maximum IO size (in KB) used b 876173738 e y sort/hash-join in auto mode _smm_auto_cost_enabl 1 TRUE TRUE TRUE if TRUE, use the AUTO size pol 1976570560 ed icy cost functions _smm_control 3 0 0 TRUE provides controls on the memor 1609852098 y manager _smm_trace 3 0 0 TRUE Turn on/off tracing for SQL me 4181964803 mory manager _smm_min_size 3 1024 1024 TRUE minimum work area size in auto 2719042006 mode _smm_max_size 3 10240 10240 TRUE maximum work area size in auto 2148264545 mode (serial) _smm_px_max_size 3 1310720 1310720 TRUE maximum work area size in auto 2315338250 mode (global) _smm_retain_size 3 0 0 TRUE work area retain size in SGA f 3748517925 or shared server sessions (0 f or AUTO) _smm_bound 3 0 0 TRUE overwrites memory manager auto 1005027971 matically computed bound _smm_advice_log_size 3 0 0 TRUE overwrites default size of the 3174969030 PGA advice workarea history l og _smm_advice_enabled 1 TRUE TRUE TRUE if TRUE, enable v$pga_advice 1787600467 _smm_freeable_retain 3 5120 5120 TRUE value in KB of the instance fr 3791311125 eeable PGA memory to retain _smm_isort_cap 3 0 0 TRUE maximum work area for insertio 157700598 n sort(v1)
PGA调整建议
SQL> set pagesize 200; SQL> select PGA_TARGET_FOR_ESTIMATE/1024/1024 PGAMB,PGA_TARGET_FACTOR,ESTD_PGA_CACHE_HIT_PERCENTAGE,ESTD_OVERALLOC_COUNT FROM V$PGA_TARGET_ADVICE; PGAMB PGA_TARGET_FACTOR ESTD_PGA_CACHE_HIT_PERCENTAGE ESTD_OVERALLOC_COUNT ---------- ----------------- ----------------------------- -------------------- 320 .125 100 0 640 .25 100 0 1280 .5 100 0 1920 .75 100 0 2560 1 100 0 3072 1.2 100 0 3584 1.4 100 0 4096 1.6 100 0 4608 1.8 100 0 5120 2 100 0 7680 3 100 0 10240 4 100 0 15360 6 100 0 20480 8 100 0
v$pga_target_advice_histogram视图可以通过对不同工作区大小的采样评估提供统计信息供分析使用。
SQL> desc v$pga_target_advice_histogram; PGA_TARGET_FOR_ESTIMATEPGA_TARGET_FACTOR ADVICE_STATUS LOW_OPTIMAL_SIZE Histogram评估区间Optimal下限(bytes) HIGH_OPTIMAL_SIZE Histogram评估区间Optimal上限(bytes) ESTD_OPTIMAL_EXECUTIONS Histogram评估区间Optimal执行次数 ESTD_ONEPASS_EXECUTIONS Histogram评估区间Onepassl执行次数 ESTD_MULTIPASSES_EXECUTIONS Histogram评估区间Multipassl执行次数ESTD_TOTAL_EXECUTIONS Histogram评估区间执行的总次数IGNORED_WORKAREAS_COUNT 被忽略的工作区总次数 select pga_target_factor factor, low_optimal_size / 1024 low, round(high_optimal_size / 1024) high, estd_optimal_executions estd_opt, estd_onepass_executions estd_op, estd_multipasses_executions estd_mp, estd_total_executions estd_exec from v$pga_target_advice_histogram where pga_target_factor = 0.25 and estd_total_executions > 0;