PGA的组成、分配和监控

最近遇到与PGA分配相关的一些问题,查了下资料,这里对看过的东西做个总结:
本文只讨论专用服务器连接的模式。[@more@]

一、组成
PGA分成固定区和可变区,可变区也称为PGA堆。PGA堆又分为UGA、CGA等。
UGA分成固定区和可变区,可变区也称为UGA堆。UGA堆包含私有SQL区、SESSION信息区等
私有SQL区包含永久内存区和运行时区。
永久内存区:这里存放了相同SQL语句多次执行时都需要的一些游标信息,比如绑定变量信息、数据类型转换信息等。这部分内存只有在游标被关闭时才会被释放。
运行时区:这里存放了当SQL语句运行时所使用的一些信息,SORT、HASH JOIN等就发生在这里。
SESSION信息区:包含SESSION的一些信息,如alter session产生的信息、NLS、DBLINK等
CGA就是调用全局区,存放与调用相关的信息,如调用栈
二、分配方法
这里只讨论9I PGA自动管理方式下的PGA分配。
当新的连接建立后,会分配0.23m的内存给新生成的服务器进程。
当处理一条SQL语句的时候,oracle会使用本地内存管理器(local memory manager)对该SQL语句相关的work area profile进行注册。work area profile是一组元数据,描述了该SQL语句所需要的工作区的所有特征,包括该SQL的类型(sort还是hash-join等)、该SQL语句的并行度、所需要的内存等信息。它是SQL语句操作与内存管理器之间唯一的接口。当SQL语句执行完毕时,其对应的work area profile就会被删除。而在SQL语句执行期间,为了反映SQL语句当前已经消耗的内存以及是否被交换到临时表空间了等状态信息,oracle会不断更新其对应的work area profile。所以说,SQL语句的work area profile是有生命周期的,始终能够体现其对应SQL语句的工作区状态。因此,我们可以说,在任何时间点,所有当前活动的work area profile就能够基本体现当前所有session对PGA内存的需要以及当前正在使用的PGA内存。通过查询视图v$sql_workarea_active,可以显示所有当前活动的work area profile的相关信息。
现在,我们需要引入另外一个后台守护进程(background daemon),叫做全局内存管理器(global memory manager)。这个进程每隔3秒会启动一次。每次启动时,都会根据当前所有活动的work area profile的数量以及其他相关信息计算出这个时候的SQL工作区的“内存限度(memory bound)”,也就是每个工作区最大尽量不能超过多大(不过,注意,严格说来应该是尽量不超过。实际上这个最大值是可以被超过的,后面会用个实例来说明)。然后立即发布这个“内存限度”。
最后,本地内存管理器关闭“反馈循环”,并根据当前的“内存限度”以及当前work area profile,从而计算出当前SQL工作区应该具有的内存大小,并为进程分配该大小的内存以执行SQL语句,这个内存的大小尺寸就叫做“期望尺寸(expect size)”,可以从v$sql_workarea_active的expected_size列看到“期望尺寸”的大小。同时,这个“期望尺寸”会定时更新,并据此对SQL工作区进行调整。
Oracle内部对这个“期望尺寸”的大小有如下规则的限制:
“期望尺寸”不能小于最低的内存需求。
“期望尺寸”不能大于optimal尺寸。
如果“内存限度”介于最低的内存需求和optimal尺寸之间,则使用“内存限度”作为“期望尺寸”的大小,但是排序操作除外。因为排序操作算法的限制,对于分配的内存在optimal尺寸和onepass尺寸之间时,排序操作不会随着内存的增加而更快完成,除非能够为排序操作分配optimal尺寸。所以,如果排序操作的“内存限度”介于onepass尺寸和optimal尺寸之间的话,“期望尺寸”取onepass尺寸。
如果SQL以并行方式运行,则“期望尺寸”为上面三个规则算出的值乘以并行度。
非并行模式下,按照通常的说法是“期望尺寸”不能超过min(5%*pga_aggregate_target,100MB)。但实际上,这是在不修改_pga_max_size和_smm_max_size这两个隐藏参数的前提下,可以简单的这么认为。严格说来,应该是不能超过min(5%*pga_aggregate_target,50%*_pga_max_size,_smm_max_size)。对于并行的情况,就更加复杂,可以简单认为不超过30%*pga_aggregate_target。

三、监控
-----查询SQL语句占用PGA的情况:
SELECT
b.sql_text,
a.operation_type,
a.policy,
a.last_memory_used/(1024*1024) as "Used MB" ,
a.estimated_optimal_size/(1024*1024) as "Est Opt MB",
a.estimated_onepass_size/(1024*1024) as "Est OnePass MB",
a.last_execution,
FROM v$sql_workarea a,v$sql b
WHERE a.hash_value = b.hash_value
and a.hash_value = &hashvalue
-----查询会话占用PGA的情况:
select a.name, b.value
from v$statname a, v$sesstat b
where a.statistic# = b.statistic#
and b.sid = &sid
and a.name like '%ga %'
-----查询进程占用PGA的情况:
SELECT
a.pga_used_mem "PGA Used",
a.pga_alloc_mem "PGA Alloc",
a.pga_max_mem "PGA Max"
FROM v$process a,v$session b
where a.addr = b.paddr
and b.sid= &sid

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

原文见http://www.bitscn.com/oracle/base/200611/82339.html

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/85922/viewspace-986945/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/85922/viewspace-986945/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值