Tuning PGA Memory
You can get the correct size of PGA using V$PGA_TARGET_ADVICE, dynamic performance view.
SQL> SELECT ROUND(pga_target_for_estimate/1024/1024) target_mb, 2 estd_pga_cache_hit_percentage cache_hit_perc,estd_overalloc_count 3 FROM V$PGA_TARGET_ADVICE; TARGET_MB CACHE_HIT_PERC ESTD_OVERALLOC_COUNT ---------- -------------- -------------------- 250 66 13703 500 87 86 1000 95 4 1500 95 0 2000 98 0 2400 99 0 2800 99 0 3200 99 0 3600 99 0 4000 99 0 6000 99 0 8000 99 0 12000 99 0 16000 99 0
Checking PGA for each sessions
You can check session level PGA using V$SESSTAT and V$SESSION view and also you can check the username, who is using that memory.
sys@OEM12C>SELECT round(s.value/1024/1024 ,2) MB ,s.sid,a.username 2 FROM V$SESSTAT S, V$STATNAME N, V$SESSION A 3 WHERE n.STATISTIC# = s.STATISTIC# and 4 name = 'session pga memory' 5 AND s.sid=a.sid 6 ORDER BY s.value; MB SID USERNAME -------------------- -------------------- ------------------------------ .41 1104 .41 1103 .41 1105 .47 1089 .47 1095 .53 1074 ICME .53 1078 ICME .53 1063 ICME .53 1087 .66 1098 .78 1064 ICME .78 1084 ICME .8 1100 .89 1099 .97 1069 SYS 1.03 1097 1.1 1088 1.47 1061 ZABBIX 1.78 1096 2.39 1067 GGSMGR 4.65 1102 11.21 1101
To check the total PGA in use and hit ratio for PGA
sys@GGS>SELECT * FROM V$PGASTAT; NAME VALUE UNIT ---------------------------------------------------------------- -------------------- ------------ aggregate PGA target parameter 3879731200 bytes aggregate PGA auto target 3467400192 bytes global memory bound 387973120 bytes total PGA inuse 27149312 bytes total PGA allocated 57661440 bytes maximum PGA allocated 4563434496 bytes total freeable PGA memory 25755648 bytes process count 25 max processes count 63 PGA memory freed back to OS 15763969212416 bytes total PGA used for auto workareas 0 bytes maximum PGA used for auto workareas 2923335680 bytes total PGA used for manual workareas 0 bytes maximum PGA used for manual workareas 1899520 bytes over allocation count 0 bytes processed 36117468017664 bytes extra bytes read/written 3105058237440 bytes cache hit percentage 92.08 percent recompute count (total) 4175071
The ideal way to perform sorts is by doing the entire job in memory. A sort job that Oracle performs entirely in memory is said to be an optimal sort. If you set the PGA_AGGREGATE_TARGET too low, some of the sort data is written out directly to disk (temporary tablespace) because the sorts are too large to fit in memory. If only part of a sort job spills over to disk, it’s called a 1-pass sort. If the instance performs most of the sort on disk instead of in memory, the response time will be high. This is called multi pass sort.
Another method of checking the efficiency of PGA memory is to check V$SQL_WORKAREA_HISTOGRAM.
V$SQL_WORKAREA_HISTOGRAM displays the cumulative work area execution statistics (cumulated since instance startup) for different work area groups. The work areas are split into 33 groups based on their optimal memory requirements with the requirements increasing in powers of two. That is, work areas whose optimal requirement varies from 0 KB to 1 KB, 1 KB to 2 KB, 2 KB to 4 KB, … and 2 TB to 4 TB.
For each work area group, the V$SQL_WORKAREA_HISTOGRAM view shows how many work areas in that group were able to run in optimal mode, how many were able to run in one-pass mode, and finally how many ran in multi-pass mode. The DBA can take a snapshot at the beginning and the end of a desired time interval to derive the same statistics for that interval.
sys@GGS>SELECT 2 low_optimal_size/1024 "Low (K)", 3 (high_optimal_size + 1)/1024 "High (K)", 4 optimal_executions "Optimal", 5 onepass_executions "1-Pass", 6 multipasses_executions ">1 Pass" 7 FROM v$sql_workarea_histogram 8 WHERE total_executions <> 0; Low (K) High (K) Optimal 1-Pass >1 Pass -------------------- -------------------- -------------------- -------------------- -------------------- 2 4 22167255 0 0 64 128 31068 0 0 128 256 13624 0 0 256 512 52058 0 0 512 1024 1821196 0 0 1024 2048 528162 0 0 2048 4096 285108 6 0 4096 8192 366635 300 0 8192 16384 555839 14 0 16384 32768 13526 205 0 32768 65536 236743 276 0 65536 131072 5570 52 0 131072 262144 24924 12789 0 262144 524288 105 608 0 524288 1048576 0 290 0 1048576 2097152 0 59 0 2097152 4194304 0 8 0
You can check the proportion of work areas since you started the Oracle instance, using optimal, 1-pass, and multipass PGA memory sizes.
sys@GGS>SELECT name PROFILE, cnt COUNT, 2 DECODE(total, 0, 0, ROUND(cnt*100/total)) PERCENTAGE 3 FROM (SELECT name, value cnt, (sum(value) over ()) total 4 FROM V$SYSSTAT 5 WHERE name like 'workarea exec%'); PROFILE COUNT PERCENTAGE ---------------------------------------------------------------- -------------------- -------------------- workarea executions - optimal 26154868 100 workarea executions - onepass 14607 0 workarea executions - multipass 0 0
Since almost all the sorting and temporary operation are carried out inder optimal catagory we can conclude that out PGA is sized correctly.
references http://avdeo.com/2007/06/17/tuning-pga-memory-oracle-database-10g/
对不起,这篇文章暂时关闭评论。