全部博文(413)
分类: Oracle
2012-10-23 09:12:39
跟其它的全局区不同,Call Global Area是短暂性存在的.它只有在函数调用期间存在,一般是在对实例的最低级别的调用时才需要CGA,比如:分析一个SQL语句,执行一个SQL语句,取出一个SELECT语句的输出
一个单独的CGA在递归调用时是需要的.在SQL语句的分析过程中,对数据字典信息的递归调用是需要的,因为要对SQL语句进行语法分析,还有在语句的优化期间要计算执行计划.执行PL/SQL块时在处理SQL语句的执行时也是需要递归调用的,在DML语句的执行时要处理触发器执行也是需要递归调用的.
不管UGA是放在PGA中还是在SGA中,CGA都是PGA的一个子堆(Subheap).这个事实的一个重要推论是在一个调用的期间会话必须是一个进程.对于在一个MTS的Oracle数据库进程应用开发时关于这一点的理解是很重要的.如果相应的调用较多,就得增加processes的数量以适应调用的增加.
没有CGA中的数据结构,CALLS是没法工作的. 而实际上跟一次CALL相关的数据结构一般都是放在UGA中,如SQL AREA,PL/SQL AREA, SORT 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
设置参数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):
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曾今达到的最大值
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:大量操作需要产生磁盘交互,性能极差。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?