PGA_AGGREGATE_TARGET vs PGA_AGGREGATE_LIMIT
WITHpgastat_denorm_1 AS (SELECT /*+ MATERIALIZE NO_MERGE */ snap_id, dbid, instance_number, SUM(CASE name WHEN 'PGA memory freed back to OS' THEN value ELSE 0 END) pga_mem_freed_to_os, SUM(CASE name WHEN 'aggregate PGA auto target' THEN value ELSE 0 END) aggr_pga_auto_target, SUM(CASE name WHEN 'aggregate PGA target parameter' THEN value ELSE 0 END) aggr_pga_target_param, SUM(CASE name WHEN 'bytes processed' THEN value ELSE 0 END) bytes_processed, SUM(CASE name WHEN 'extra bytes read/written' THEN value ELSE 0 END) extra_bytes_rw, SUM(CASE name WHEN 'global memory bound' THEN value ELSE 0 END) global_memory_bound, SUM(CASE name WHEN 'maximum PGA allocated' THEN value ELSE 0 END) max_pga_allocated, SUM(CASE name WHEN 'maximum PGA used for auto workareas' THEN value ELSE 0 END) max_pga_used_aut_wa, SUM(CASE name WHEN 'maximum PGA used for manual workareas' THEN value ELSE 0 END) max_pga_used_man_wa, SUM(CASE name WHEN 'total PGA allocated' THEN value ELSE 0 END) tot_pga_allocated, SUM(CASE name WHEN 'total PGA inuse' THEN value ELSE 0 END) tot_pga_inuse, SUM(CASE name WHEN 'total PGA used for auto workareas' THEN value ELSE 0 END) tot_pga_used_aut_wa, SUM(CASE name WHEN 'total PGA used for manual workareas' THEN value ELSE 0 END) tot_pga_used_man_wa, SUM(CASE name WHEN 'total freeable PGA memory' THEN value ELSE 0 END) tot_freeable_pga_mem FROM dba_hist_pgastat WHERE name IN('PGA memory freed back to OS','aggregate PGA auto target','aggregate PGA target parameter','bytes processed','extra bytes read/written','global memory bound','maximum PGA allocated','maximum PGA used for auto workareas','maximum PGA used for manual workareas','total PGA allocated','total PGA inuse','total PGA used for auto workareas','total PGA used for manual workareas','total freeable PGA memory') AND snap_id in (select snap_id from dba_hist_snapshot where begin_interval_time > sysdate -60) GROUP BY snap_id, dbid, instance_number),pgastat_denorm_2 AS (SELECT /*+ MATERIALIZE NO_MERGE */ h.dbid, h.instance_number, s.startup_time, MIN(h.pga_mem_freed_to_os) pga_mem_freed_to_os, MIN(h.bytes_processed) bytes_processed, MIN(h.extra_bytes_rw) extra_bytes_rw FROM pgastat_denorm_1 h, dba_hist_snapshot s WHERE s.snap_id = h.snap_id AND s.dbid = h.dbid AND s.instance_number = h.instance_number GROUP BY h.dbid, h.instance_number, s.startup_time),pgastat_delta AS (SELECT /*+ MATERIALIZE NO_MERGE */ h1.snap_id, h1.dbid, h1.instance_number, s1.begin_interval_time, s1.end_interval_time, ROUND((CAST(s1.end_interval_time AS DATE) - CAST(s1.begin_interval_time AS DATE)) * 24 * 60 * 60) interval_secs, (h1.pga_mem_freed_to_os - h0.pga_mem_freed_to_os) pga_mem_freed_to_os, h1.aggr_pga_auto_target, h1.aggr_pga_target_param, (h1.bytes_processed - h0.bytes_processed) bytes_processed, (h1.extra_bytes_rw - h0.extra_bytes_rw) extra_bytes_rw, h1.global_memory_bound, h1.max_pga_allocated, h1.max_pga_used_aut_wa, h1.max_pga_used_man_wa, h1.tot_pga_allocated, h1.tot_pga_inuse, h1.tot_pga_used_aut_wa, h1.tot_pga_used_man_wa, h1.tot_freeable_pga_mem FROM pgastat_denorm_1 h0, pgastat_denorm_1 h1, dba_hist_snapshot s0, dba_hist_snapshot s1, pgastat_denorm_2 min /* to see cumulative use (replace h0 with min on select list above) */ WHERE h1.snap_id = h0.snap_id + 1 AND h1.dbid = h0.dbid AND h1.instance_number = h0.instance_number AND s0.snap_id = h0.snap_id AND s0.dbid = h0.dbid AND s0.instance_number = h0.instance_number AND s1.snap_id = h1.snap_id AND s1.dbid = h1.dbid AND s1.instance_number = h1.instance_number AND s1.snap_id = s0.snap_id + 1 AND s1.startup_time = s0.startup_time AND s1.begin_interval_time > (s0.begin_interval_time + (1 / (24 * 60))) /* filter out snaps apart < 1 min */ AND min.dbid = s1.dbid AND min.instance_number = s1.instance_number AND min.startup_time = s1.startup_time)SELECT snap_id, TO_CHAR(MIN(begin_interval_time), 'YYYY-MM-DD HH24:MI') begin_time, TO_CHAR(MIN(end_interval_time), 'YYYY-MM-DD HH24:MI') end_time, ROUND(SUM(pga_mem_freed_to_os) / POWER(2, 30), 3) pga_mem_freed_to_os, ROUND(SUM(aggr_pga_auto_target) / POWER(2, 30), 3) aggr_pga_auto_target, ROUND(SUM(aggr_pga_target_param) / POWER(2, 30), 3) aggr_pga_target_param, ROUND(SUM(bytes_processed) / POWER(2, 30), 3) bytes_processed, ROUND(SUM(extra_bytes_rw) / POWER(2, 30), 3) extra_bytes_rw, ROUND(SUM(global_memory_bound) / POWER(2, 30), 3) global_memory_bound, ROUND(SUM(max_pga_allocated) / POWER(2, 30), 3) max_pga_allocated, ROUND(SUM(max_pga_used_aut_wa) / POWER(2, 30), 3) max_pga_used_aut_wa, ROUND(SUM(max_pga_used_man_wa) / POWER(2, 30), 3) max_pga_used_man_wa, ROUND(SUM(tot_pga_allocated) / POWER(2, 30), 3) tot_pga_allocated, ROUND(SUM(tot_pga_inuse) / POWER(2, 30), 3) tot_pga_inuse, ROUND(SUM(tot_pga_used_aut_wa) / POWER(2, 30), 3) tot_pga_used_aut_wa, ROUND(SUM(tot_pga_used_man_wa) / POWER(2, 30), 3) tot_pga_used_man_wa, ROUND(SUM(tot_freeable_pga_mem) / POWER(2, 30), 3) tot_freeable_pga_mem, 0 dummy_15 FROM pgastat_delta GROUP BY snap_id ORDER BY snap_id;Captured and imported the result into Excel spreadsheet. Then I created the following two charts showing PGA allocation and usage for the past 60 days and 7 days.