一些PGA

 

  1. PGA的结构

  PGA(Process Global Area ):是一部分进程的私有内存。

  PGA的内存分类:

       SQL区:排序、哈希、位图

       私有SQL区: 会话的内存、

  •  在后台进程是在PGA中 

          在v$process这个视图中。

 1 SQL> select pid,spid,pname,pga_used_mem from v$process;
 2 
 3        PID SPID                     PNAME PGA_USED_MEM
 4 ---------- ------------------------ ----- ------------
 5          1                                           0
 6          2 5004                     PMON        758320
 7          3 5006                     PSP0        740440
 8          4 5009                     VKTM        737200
 9          5 5013                     GEN0        744536
10          6 5015                     DIAG        737568
11          7 5017                     DBRM        820992
12          8 5019                     DIA0       1215680
13          9 5021                     MMAN        740440
14         10 5023                     DBW0       6885544
15         11 5025                     LGWR      11365656
16 
17        PID SPID                     PNAME PGA_USED_MEM
18 ---------- ------------------------ ----- ------------
19         12 5027                     CKPT        814912
20         13 5029                     SMON       1007080
21         14 5031                     RECO        881568
22         15 5033                     MMON       2034624
23         16 5035                     MMNL        758296
24         17 5037                     D000       1109940
25         18 5039                     S000        438564
26         19 15408                               2071708
27         20 4743                     W000        970752
28         21 15737                               1603232
29         22 5103                     QMNC        741592
30 
31        PID SPID                     PNAME PGA_USED_MEM
32 ---------- ------------------------ ----- ------------
33         23 5606                     SMCO        737200
34 。。。。。。。。。。。。。。。
35 
36 42 rows selected.

      从上面的视图查询中可以看书ckpt,smon等都在PGA中有内存分配。PID为1的是父进程,是所有进程的伪装进程。

[oracle@localhost ~]$ ps -ef|grep 15408
oracle    9289  5367  0 21:26 pts/2    00:00:00 grep 15408
oracle   15408     1  0 18:20 ?        00:00:01 oracleorcl (LOCAL=NO)

 可以看出在15408是server process.

  •    PGA有两个组件 

      Fixed PGA (data and control files)  ===>工作区,可控制

  Variable PGA (UGA and CGA subheaps) ===》不可控制

  •    UGA:

     固定部分,绑定变量。

     CGA:调用全局去 call gloable area

     CGAPGA的一个子堆,永远PGA

2. 管理PGA

  •   
SQL> show parameter pga

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target                 big integer 100M 
pga_aggregate_target 指的是工作区,如上图的红色部分。是一个参考值(目标值),可以操过这个值。
  • 连接上来的占用PGA是不可控的。

        实验:一个会话连上的占用的PGA

         a.查看当前的会话

SQL> select * from v$mystat where rownum=1;

       SID STATISTIC#      VALUE
---------- ---------- ----------
        22          0          0

    b.查询sid对应的会话

SQL> select saddr,paddr from v$session where sid='22';

SADDR            PADDR
---------------- ----------------
00000000BB6D1890 00000000BB514A20

  c.查询paddr对应的PGA的使用情况

SQL> select pid,spid,pname,pga_used_mem,pga_alloc_mem,pga_freeable_mem,pga_max_mem from v$process where addr='00000000BB514A20';

       PID SPID                     PNAME PGA_USED_MEM PGA_ALLOC_MEM PGA_FREEABLE_MEM PGA_MAX_MEM
---------- ------------------------ ----- ------------ ------------- ---------------- -----------
        44 8462                                 681788       2009544          1048576     2017944
[oracle@localhost ~]$ ps -ef|grep LOCAL
oracle    8462  8461  0 21:20 ?        00:00:00 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

  可以看出8462对应的的sid 进程,使用的PGA的情况。

如下是官方文档中的说明: 

PGA_USED_MEM NUMBER PGA memory currently used by the process
PGA_ALLOC_MEM NUMBER PGA memory currently allocated by the process (including free PGA memory not yet released to the operating system by the server process)
PGA_FREEABLE_MEM NUMBER Allocated PGA memory which can be freed
PGA_MAX_MEM NUMBER Maximum PGA memory ever allocated by the process
  •     PGA的组成       
1 bitmap_merge_area_size:每个会话使用位图合并连接时内存工作区的最大值       
2 create_bitmap_area_size:每个会话使用位图创建连接时内存工作区的最大值       
3 hash_area_size:每个会话使用HASH连接时内存工作区的最大值   
4 sort_area_size:每个会话使用排序连接时内存工作区的最大值         
5 workarea_size_policy 
6 sort_area_retained_size 
  •     PGA设置手动
SQL> alter system set workarea_size_policy=manual;
System altered.

        当workarea_size_policy 设置为manual着设置为手动模式,则其他的设置将失效

  •    PGA设置自动

          pga_aggregate_target:

        oltp==>在线交易 80%read +20%write==》物理内存*15%-20%  64G===8G

        olap==>数据仓库  分析排序             物理内存*40%   64G ===》 25G

问题:

  • process参数设置过大:则会数据库起不了,可能汇报ORA-4030错误。在linux中的每个PGA大约5M
  • 面试题 :

    一张大表  里面有1000万条记录,cpu men资源充足的情况下,快速建一个普通索引,在不影响性能的情况下,如何建????

         答:  a.修改PGA为手动,alter system set workarea_size_policy=manual;auto

                 b.设置排序区搞大一点  SQL>alter session set sort_area_size=2048000000;

                 c.创建索引Create index    parallel 4 nologging    索引的表空间设置为nologging ;

 

 

posted @ 2014-11-07 16:50  修行从29开始  阅读(370)  评论(1)    收藏  举报