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%。