一些PGA
- 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。
CGA是PGA的一个子堆,永远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 ;