2.未公开的Oracle数据库秘密笔记——参数说明——PGA_AGGREGATE_TARGET

欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50366043

PGA是程序全局区,是一个私有内存区域,服务器进程分配各种操作的内存比如sort,hash join 以及bitmap merge.

         在专用服务器进程中PGA中分配UGA内存,而共享服务器进程则把UGA放置于SGA中,因为必须被所有共享服务器访问到。

         9i之前,需要手动调整PGA中的内存管理参数SORT_AREA_SIZ和HASH_AREA_SIZE(除非是在共享服务器环境)。

         ORACLE是作为一个多进程架构来实现的,进行密集型操作之后,PGA内存不能总是返回到操作系统。徘徊在服务器进程的虚拟地址空间中,并可能造成分页。

         9i引入了自动PGA内存管理。基于内存映射现代技术,启用一个进程分配虚拟内存然后将其映射到自身的虚拟地址空间中。一旦不需要某内存,就可以归还。系统调用为mmap和munmap.

         ORACLE内核对内存映射的调用可以使用strace进行跟踪。

         此外,工具pmap 可以显示一个进程的地址空间信息,包括使用mmap的匿名内存映射。

         PGA_AGGREGATE_TARGET参数是一个目标值,而不是一个绝对的限制,仅仅是一个目标值而已。

         PGA内存是按需分配的。

1.  研究PGA_AGGREGATE_TARGET

先创建一个对象类型来接受编号:

CREATE OR REPLACE TYPE row_nr_type ASOBJECT (row_nr number);

/

创建一个集合类型:

CREATE OR REPLACE TYPE row_nr_type_tab ASTABLE OF row_nr_type;

/

创建函数如下:

CREATE OR REPLACE FUNCTION row_factory(first_nrnumber, last_nr number)

RETURN row_nr_type_tab PIPELINED

AS

        row_nrrow_nr_type:=NEW row_nr_type(0);

BEGIN

        FOR iIN first_nr .. last_nr LOOP

               row_nr.row_nr:=i;

               PIPE ROW(row_nr);

        END LOOP;

        return;

END;

/

例如:

SELECT * FROM TABLE(row_factory(1,10));

生成一张大表的经典方法包括从给一张真实表中筛选数据。

例如:

CREATE TABLE random_strings AS

SELECT dbms_random.string('a', 128) AS random_stringFROM TABLE(row_factory(1,1000)) NOLOGGING;

2.  V$SQL_WORKAREA_ACTIVE

动态监控PGA内存管理的方法是查询动态性能视图V$SQL_WORKAREA_ACTIVE

3.  PGA内存管理隐藏参数

使用脚本如下:

col name format a20

col value format 99999999 heading "Value(KB)"

col description format a45 word_wrapped

set verify off

set lines 83

SELECT x.ksppinm name,

CASE WHEN x.ksppinm like '%pga%' THENto_number(y.ksppstvl)/1024

ELSE to_number(y.ksppstvl)

END AS value,

x.ksppdesc description

FROM x$ksppi x, x$ksppcv y

WHERE x.inst_id = userenv('Instance')

AND y.inst_id = userenv('Instance')

AND x.indx = y.indx

AND x.ksppinm IN ('pga_aggregate_target','_pga_max_size', '_smm_max_size', '_smm_px_max_size');

执行如下:

sys@ORCL> @auto_pga_parameters.sql

 

NAME                     Value (KB) DESCRIPTION

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

pga_aggregate_target   368640 Target size for the aggregate PGA memory

                                     consumedby the instance

 

_pga_max_size                 204800 Maximum size of the PGA memory for one

                                     process

 

_smm_max_size                 73728 maximumwork area size in auto mode (serial)

_smm_px_max_size        184320 maximum work area size in auto mode (global)

三个参数会在一定限制范围内动态地进行重新计算。

3.1         _pga_max_size

限制了单个进程下所有工作区的最大大小。

3.2         _smm_max_size

限制了单个进程下一个单独工作区的最大大小。

3.3         _smm_px_max_size

始终设置为PGA_AGGREGATE_TARGET的50%。