PGA参数:
1、查看workarea_size_policy参数设置
show parameter workarea_size_policy
workarea_size_policy为auto表明PGA为自动管理

2、v$pgastat视图:
--查看pga命中率
select * from v$pgastat where name='cache hit percentage';
--v$pgastat各记录含义
select name,value from v$pgastat;
aggregate PGA target parameter --这个值等于参数PGA_AGGREGATE_TARGET的值,如果此值为0,表示禁用了PGA自动管理。
aggregate PGA auto target  --表示PGA还能提供多少内存给自动运行模式,通常这个值接近pga_aggregate_target-total pga inuse.
global memory bound  --工作区执行的最大内存,如果这个值小于1M,马上增加PGA大小
total PGA inuse --正被耗用的pga,可以从v$process的SUM(pga_used_mem)字段中获取
total PGA allocated --当前实例已分配的PGA内存总量,可能超过PGA_AGGREGATE_TARGET的限定值
maximum PGA allocated  --pga曾经扩张到的最大值
total freeable PGA memory --可释放的pga
process count --当前有几个process
max processes count  --允许的最大进程数
PGA memory freed back to OS
total PGA used for auto workareas  --auto模式下占用的workara size 大小
maximum PGA used for auto workareas --auto模式下占用的workara size最大 大小
total PGA used for manual workareas --manual模式下占用的workara size 大小
maximum PGA used for manual workareas --manual模式下占用的workara size最大 大小
over allocation count  --使用量超过pga大小的次数
bytes processed --pga使用的字节
extra bytes read/written  --向临时段写的字节
cache hit percentage --命中率为100%,如果太小增加PGA
recompute count (total)

3、v$pga_target_advice视图
SQL> show parameter pga_aggregate_target;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target                 big integer 191M

--假如我们需要调整pga_aggregate_target时,到底我们应该设置多大呢?oracle为了帮助我们确定这个参数的值,引入了一个新的视图:
--v$pga_target_advice。 为了使用该视图,需要将初始化参数statistics_level设置为typical(缺省值)或all。
SELECT a.pga_target_for_estimate / 1024 / 1024, --调整后的pga大小
       a.pga_target_factor,--当前pga大小
       a.estd_pga_cache_hit_percentage,--pga中cache命中的百分比
       a.estd_overalloc_count --PGA的过载量,最好为0
  FROM v$pga_target_advice a;
A.PGA_TARGET_FOR_ESTIMATE/1024 PGA_TARGET_FACTOR ESTD_PGA_CACHE_HIT_PERCENTAGE ESTD_OVERALLOC_COUNT
------------------------------ ----------------- ----------------------------- --------------------
                        23.875             0.125                            62                 1000
                         47.75              0.25                            83                  141
                          95.5               0.5                            89                   55
                        143.25              0.75                            89                   44
                           191                 1                            92                    1
                  229.19921875               1.2                            92                    0
                267.3994140625               1.4                            92                    0
                 305.599609375               1.6                            92                    0
                343.7998046875               1.8                            92                    0
                           382                 2                            93                    0
                           573                 3                            93                    0
                           764                 4                            93                    0
                          1146                 6                            93                    0
                          1528                 8                            93                    0
pga_target_factor为1表示当前的pga大小,1其他都是以这个进行相比的比值。

/*
同时,我们知道v$tempstat里记录了读写临时表空间的数据块数量以及所花费的时间。这样,我们就可以结合v$pga_target_advice和v$tempstat
这两个视图。可以得到每一种估计PGA值下的响应时间大致是多少,从而可以换一个角度来显示PGA的建议值:
*/
SELECT 'PGA Aggregate Target' component,
       ROUND(pga_target_for_estimate / 1024 / 1024) target_size,
       estd_pga_cache_hit_percentage cache_hit_ratio,
       ROUND(((estd_extra_bytes_rw /
             DECODE((b.blocksize * i.avg_blocks_per_io),
                      0,
                      1,
                      (b.blocksize * i.avg_blocks_per_io))) * i.iotime) / 100) "response_time(sec)"
  FROM v$pga_target_advice,
       (SELECT AVG((readtim + writetim) /
                   DECODE((phyrds + phywrts), 0, 1, (phyrds + phywrts))) iotime,
               AVG((phyblkrd + phyblkwrt) /
                   DECODE((phyrds + phywrts), 0, 1, (phyrds + phywrts))) avg_blocks_per_io
          FROM v$tempstat) i,
       (SELECT value blocksize FROM v$parameter WHERE NAME = 'db_block_size') b; --b表示查询数据库当前块大小

4、v$sql_workarea_histogram视图:
完全在内存中排序的为最佳排序(optimal_executions);若内存不够,直接将部分数据写出到磁盘的称为一遍排序(onepass_executions)

SELECT a.low_optimal_size,--最佳执行的pga最小大小
       a.high_optimal_size,--最佳执行的pga最大大小
       a.optimal_executions,--最佳执行的次数
       a.onepass_executions,--遍历一次的次数
       a.multipasses_executions,--遍历多次的次数
       a.total_executions --总的执行次数
  FROM v$sql_workarea_histogram a
 WHERE total_executions <> 0
 ORDER BY low_optimal_size;

/*optimal、onepass、multipass执行次数的百分比,optimal所占的百分比越高越好,如果onepass和 multipass占的百分比很高,
就不需要增加pga_aggregate_target的值了,或者调整SQL语句以使用更少的PGA区*/
SELECT optimal_count,
       ROUND(optimal_count / total_count * 100, 2) "optimal_count%",
       onepass_count,
       ROUND(onepass_count / total_count * 100, 2) "onepass_count%",
       multipass_count,
       ROUND(multipass_count / total_count * 100, 2) "multipass_count%"
  FROM (SELECT SUM(a.total_executions) total_count,
               SUM(a.optimal_executions) optimal_count,
               SUM(a.onepass_executions) onepass_count,
               SUM(a.multipasses_executions) multipass_count
          FROM v$sql_workarea_histogram a
         WHERE a.total_executions <> 0)

5、v$process_memory和v$process视图:         
--查看每个进程每种类型(SQL、PL/SQL、OLAP和JAVA)分配的pga大小
SELECT * FROM v$process_memory;
--查看每个进程pga的具体分配情况(已使用的,分配值,空闲值,最大值)
SELECT p.program,--进程
       p.pga_used_mem,--使用的内存
       p.pga_alloc_mem,--分配的内存
       p.pga_freeable_mem,--空闲的内存
       p.pga_max_mem   --最大可有的内存
  FROM v$process p;

SELECT SUM(pga_used_mem),SUM(pga_alloc_mem),SUM(pga_max_mem) FROM v$process;

--查看工作区执行排序情况
SELECT name,
       cnt,
       DECODE(total, 0, 0, ROUND(cnt / total * 100, 2)) percentage
  FROM (SELECT name, value cnt, SUM(value) OVER() total
          FROM v$sysstat
         WHERE name like 'workarea exec%');

6、v$sql_workarea_active视图:显示当前工作区的活动情况
SELECT to_number(decode(SID, 65535, NULL, SID)) sid,
       operation_type operation,
       trunc(expected_size/1024) esize,--PGA管理器估计的本次操作需要的总内存数量
       trunc(actual_mem_used/1024) mem,--目前正在使用的内存数量
       trunc(max_mem_used/1024) "max mem",--该SESSION曾经使用的最大PGA内存数量
       number_passes pass,--0代表内存排序,1代表1-pass排序,M代表M-PASS排序
       trunc(tempseg_size/1024) tsize --转储到临时表空间的大小
  FROM v$sql_workarea_active
 ORDER BY 1,2;

7、查看分配给各个会话的内存量
SELECT s.value,s.sid,a.username FROM v$sesstat s, v$statname n, v$session a
 WHERE s.statistic# = n.statistic#
   AND n.name = 'session pga memory'
   AND s.sid = a.sid

8、pga大致分配规则
For OLTP 系统
 PGA_AGGREGATE_TARGET = (<Total Physical Memory > * 80%) * 20%
For DSS 系统
 PGA_AGGREGATE_TARGET = (<Total Physical Memory > * 80%) * 50%
 
--查看OLAP
cmd 用sqlplus "/ as sysdba"登陆
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

posted on 2011-08-10 22:17  蓝紫  阅读(2786)  评论(0编辑  收藏  举报