Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1782651
  • 博文数量: 413
  • 博客积分: 8399
  • 博客等级: 中将
  • 技术积分: 4325
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-09 10:44
文章分类

全部博文(413)

文章存档

2015年(1)

2014年(18)

2013年(39)

2012年(163)

2011年(192)

分类: Oracle

2012-10-23 09:12:39

Oracle的内存结构,除了SGA(System Global Area)之外,Oracle进程还使用下面三个全局区:
PGA: process global area
UGA: user global area
CGA: call global area

1. PGA与UGA
很多人都搞不清楚PGAUGA两者之间的区别,实际上两者之间的区别跟一个进程和一个会话之间的区别是类似.尽管说进程和会话之间一般都是一对一的关系,但实际上比这个更复杂.一个很明显的情况是MTS配置,会话往往会比进程多得多.在这种配置下,每一个进程会有一个PGA,每一个会话会有一个UGAPGA所包含的信息跟会话是无任何关联的UGA包含的信息是以特定的会话为基础的.

2. PGA
进程全局区(PGA)即可以理解为Process Global Area,也可以理解为Program Global Area.它的内存段是在进程私有区(Process Private Memory)而不是在共享区(Shared Memory). 每个Oracle的server process都有属于自己的PGA,它只包含了本进程的相关特定信息.PGA中的结构不需要由latches来保护,因为其它的进程是不能进入到这里面来访问的.

PGA包含两个主要区域:Fixed PGAVariable PGA或称为PGA Heap
Fixed PGA的作用跟Fixed SGA是类似的,都包含原子变量(不可分的),小的数据结构和指向Variable PGA的指针.
Variable PGA是一个堆.它的Chunks可以从Fixed Table X$KSMPP查看得到,这个表的结构跟前面有提到的X$KSMSP是相同的. PGA HEAP包含了一些有关Fixed Table的永久性内存,它跟某些参数的设置有依赖关系.这些参数包含DB_FILES,LOG_FILES,CONTROL_FILES.

3. UGA
UGA(User Global Area)包含的是特定会话的信息。

PGA一样,UGA也由两区组成:Fixed UGAVariable UGA,也称为UGA HEAP. Fixed UGA包含了大约70个原子变量,小的数据结构和指向Variable UGA的指针. 

UGA HEAP中的Chunks可以从它们自己的会话中通过查看表X$KSMUP获得相关信息,这个表的结构跟X$KSMSP是一样的.UGA HEAP包含了一些有关fixed tables的永久性内存段,跟一些参数的设置有依赖关系.这些参数有OPEN_CURSORS,OPEN_LINKS,MAX_ENABLE_ROLES. 

UGA在内存中的位置依赖于会话的配置方式.
如果会话连接的配置方式是专用服务器模式(DDS)即是一个会话对应一个进程,UGA是放在PGA中的PGA, Fixed UGA是其中的一个Chunk, UGA HEAPPGA的一个子堆(Subheap). 

如果会话连接是配置为共享服务器模式(MTS), Fixed UGASHARED POOL或者Large pool中的一个Chunk, UGA HEAP则是SHARED POOL或者large pool中的子堆(Subheap). 

4. CGA

跟其它的全局区不同,Call Global Area是短暂性存在的.它只有在函数调用期间存在,一般是在对实例的最低级别的调用时才需要CGA,比如:分析一个SQL语句,执行一个SQL语句,取出一个SELECT语句的输出

一个单独的CGA在递归调用时是需要的.SQL语句的分析过程中,对数据字典信息的递归调用是需要的,因为要对SQL语句进行语法分析,还有在语句的优化期间要计算执行计划.执行PL/SQL块时在处理SQL语句的执行时也是需要递归调用的,DML语句的执行时要处理触发器执行也是需要递归调用的.

不管UGA是放在PGA中还是在SGA,CGA都是PGA的一个子堆(Subheap).这个事实的一个重要推论是在一个调用的期间会话必须是一个进程.对于在一个MTSOracle数据库进程应用开发时关于这一点的理解是很重要的.如果相应的调用较多,就得增加processes的数量以适应调用的增加. 

没有CGA中的数据结构,CALLS是没法工作的而实际上跟一次CALL相关的数据结构一般都是放在UGA,SQL AREA,PL/SQL AREASORT AREA, hash area, bitmap area它们都必须在UGA因为它们要在各CALLS之间要一直存在并且可用CGA中所包含的数据结构是要在一次CALL结束后能够释放的例如CGA包含了关于递归调用的信息,直接I/O BUFFER等还有其它的一些临时性的数据结构. 

5. 总结一下

PGA包括:
1)Fixed PGA
2)UGA (dedicated server),当系统是shared server时,UGA位于shared pool或者large pool。
3)CGA

而UGA和CGA都属于Variable PGA(PGA heap)

UGA包括:

1)Fixed UGA
2)private SQL area
3)session memory
4)
SQL Work Areas

private SQL area, session memory, SQL work ares都属于variable UGA(UGA heap).

6. private SQL area
可以分为两部分:
1)永久内存区域:存放相同SQL语句多次执行时都需要的一些游标信息,比如绑定变量等。这部分内存只有在游标被关闭时才释放。所以称为:永久内存区域。

2)运行时区域:处理SQL语句时的第一步要创建运行时区域,这里存放了当SQL运行时所使用的信息。对于DML语句,SQL执行完毕就释放该区域;对于select语句,当所有数据行返回给用户时释放。

7. session area
保存该session的一些参数,比如:修改的NLS参数,修改的优化器参数optimizer_mode,alter session命令所启用的跟踪信息,可以使用的roles,所打开的db links,真正使用的package等。

8. SQL work area
SQL工作区是UGA中最重要的部分,占UGA的大部分内存。主要是在排序sort(ordr by, group by),hash-join时使用。SQL工作区的大小对性能的影响很大。

一般大数量的排序,是不太可能完全在SQL work area中完成的,因为没有那么大的内存,所以一般都会使用临时表空间,将排序的中间结果写入到temp表空间中(磁盘排序)。根据SQL work area的大小,使用临时表空间的次数可以是一次,也可能是多次。所以有三种情况:

1)optimal: 排序完全在内存中完成;
2)onepass: 排序完成,需要使用磁盘一次;
3)multipass: 排序的完成,需要使用磁盘多次;

optimal一般是不太现实的,我们一般尽量保证onepass,如果导致了multipass,则性能会下降很多。我们先来看看排序的过程:

排序算法采用的是堆排序;排序方式是分批排序,比如10000条记录排序,把它分成100次,每次对100条记录排序;当100条排序完成之后,写入到temp表空间;再对下100条排序,排序完之后在写入到temp表空间;最后对temp表空间的100个局部排序的队列进行merge操作。从而完成对10000条记录的排序。这样是比较理想的情况,因为只对磁盘读写一次,属于onepass。如果排序涉及到磁盘的多次读写,则属于multipass。一般我们尽量调整sort_area_size的大小,来避免multipass排序。

SQL work area可以分为下面几个部分:

排序区(sort_area_size),hash区(hash_area_size),bitmap区(create_bitmap_area_size,bitmap_merge_area_size)等,他们深刻的影响着排序、hash-join、bitmap等的性能。

9. PGA的自动管理
在Oracle9i之前,我们是通过设置sort_area_size, hash_area_size等参数来管理PGA。

SQL> show parameter area_size;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

bitmap_merge_area_size               integer     1048576

create_bitmap_area_size              integer     8388608

hash_area_size                       integer     131072

sort_area_size                       integer     65536

workarea_size_policy                 string      AUTO

SQL> show parameter sort_area;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

sort_area_retained_size              integer     0

sort_area_size                       integer     65536


而从Oracle9i开始,Oracle引入了PGA的自动管理。不需要我们单独地设置大小了。

设置参数workarea_size_policy参数,可以在PGA自动(auto默认是auto)和PGA手动管理(manual)之间进行选择。

然后通过初始化参数pga_aggregate_size来设置PGA的内存总和(相当于SGA的sga_max_size)。注意在Oracle9i时,PGA自动管理只对dedicate server有效,对shared server无效,但是在Oracle10g时,PGA自动管理都有效。

10. PGA大小设置:

对于OLTP系统,典型的PGA内存为:

PGA_AGGREGATE_SIZE = (total_memory * 80%) * 20%

对于OLAP系统,由于会运行一些很大的查询:

PGA_AGGREATE_SIZE = (total_memoery * 80%) * 50%

80%是指,将机器总内存的80%分给Oracle使用。然后在将80%中的20%给PGA。

我们也可以使用PGA相关的一些视图来调整pga_aggregate_size的大小:

v$pgastat, v$pga_target_advice, v$pga_target_advice_histogram  

使用v$pgastat查看当前PGA的统计信息(类似于v$sgastat和SGA):

SQL> select * from v$pgastat;

NAME                                          VALUE UNIT

---------------------------------------- ---------- ------------

aggregate PGA target parameter             71303168 bytes

aggregate PGA auto target                  27297792 bytes

global memory bound                        14260224 bytes

total PGA inuse                            40966144 bytes

total PGA allocated                        88008704 bytes

maximum PGA allocated                     125034496 bytes

total freeable PGA memory                   4259840 bytes

process count                                    23

max processes count                              40

PGA memory freed back to OS               492634112 bytes

total PGA used for auto workareas                 0 bytes

maximum PGA used for auto workareas         6105088 bytes

total PGA used for manual workareas               0 bytes

maximum PGA used for manual workareas             0 bytes

over allocation count                             0

bytes processed                          6275959808 bytes

extra bytes read/written                          0 bytes

cache hit percentage                            100 percent

recompute count (total)                       33814

19 rows selected.
maximum PGA allocated:PGA曾今达到的最大值

over allocation count: Over allocating PGA memory can happen if the value ofPGA_AGGREGATE_TARGET is too small. When this happens, the Oracle Database cannot honor the value of PGA_AGGREGATE_TARGET and extra PGA memory needs to be allocated. If over allocation occurs, then increase the value of PGA_AGGREGATE_TARGET using the information provided by the V$PGA_TARGET_ADVICE view.
extra bytes read/written: Number of bytes processed during extra passes of the input data, cumulated since instance startup. When a work area cannot run optimal, one or more of these extra passes is performed. (即磁盘排序的读写磁盘的字节数)

使用v$pga_target_advice来估测PGA的大小,即PGA的建议值(类似于v$sga_target_advice和SGA):
V$PGA_TARGET_ADVICE predicts how the cache hit percentage and over allocation count statistics displayed by the V$PGASTAT performance view would be impacted if the value of the PGA_AGGREGATE_TARGET parameter is changed. The prediction is performed for various values of the PGA_AGGREGATE_TARGET parameter, selected around its current value. The advice statistic is generated by simulating the past workload run by the instance.

SQL> select round(pga_target_for_estimate/(1024*1024)) target_size_M,
  2  estd_pga_cache_hit_percentage est_cache_hit_percentage,
  3  round(estd_extra_bytes_rw/(1024*1024)) est_extra_read_write_M,
  4  estd_overalloc_count est_over_alloc from v$pga_target_advice;

TARGET_SIZE_M EST_CACHE_HIT_PERCENTAGE EST_EXTRA_READ_WRITE_M EST_OVER_ALLOC
------------------  ---------------------------   ---------------------- --------------
           17                       97                    186             31
           34                       97                    186             31
           51                      100                      0              2
           68                      100                      0              0
           82                      100                      0              0
           95                      100                      0              0
          109                      100                      0              0
          122                      100                      0              0
          136                      100                      0              0
          204                      100                      0              0
          272                      100                      0              0
          408                      100                      0              0
          544                      100                      0              0

13 rows selected.

使用v$pga_target_advice_histogram来估测PGA的大小(类似于v$sga_target_advice和SGA):

V$PGA_TARGET_ADVICE_HISTOGRAM predicts how statistics displayed by the V$SQL_WORKAREA_HISTOGRAM dynamic view would be impacted if the value of thePGA_AGGREGATE_TARGET parameter is changed. This prediction is performed for various values of the PGA_AGGREGATE_TARGET parameter, selected around its current value. The advice statistic is generated by simulating the past workload run by the instance.

该视图可以通过对不同工作区大小的采样评估提供统计信息共分析使用SQL在工作区中以3种方式执行:

Optimal(优化方式):指所有处理可以在内存中完成;Onepass:大部分操作可以在内存中完成,但是需要使用到磁盘排序;Multipass:大量操作需要产生磁盘交互,性能极差。

阅读(3500) | 评论(1) | 转发(2) |
0

上一篇:ORA-4031错误

下一篇:undo表空间概述

给主人留下些什么吧!~~

running_life2015-04-22 21:33:56

很不错的文章,大神,我有一个疑问,我的一个库的maximum PGA allocated值现在已经大于了pga_aggregate_target了,但是over allocation count记录值是0,这是为什么呢?难道这个over allocation count记录的不是pga总内存超过pga_aggregate_target的次数,而是单个进程pga超过单个进程pga的最大值限制_pga_max_size?