Chinaunix首页 | 论坛 | 博客
  • 博客访问: 250964
  • 博文数量: 59
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 698
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-19 21:17
文章分类

全部博文(59)

文章存档

2009年(14)

2008年(45)

我的朋友
PGA

分类: Oracle

2009-02-01 22:28:06

pga是程序全局区,也是每个服务器进程的私有sql区域,在专用服务器模式下,每个进程对应一个pga区域。pga主要包含每个服务器进程的数据和控制信息,pga是非共享的,它是在服务器进程创建的时候分配,当然一般情况下,一个服务器进程被创建,就产生了与服务器进程对应的一个session。当然一个会话如何产生的呢?这个就需要追溯到一个客户端程序发起一个请求谈起,比如我们执行sqlplus 的时候,那么客户端首先解析servicename,向服务器的监听发送请求,监听受到该请求后,看是否存在该请求相关的oracle服务,如果数据库服务存在,并且用户名与密码正确的话,那么监听器就给该请求分配一个服务器进程,同时分配该进程需要的私有内存区域(pga),此时一个连接就产生了。这个时候其实即使停止了该监听程序,该连接仍然是有效的,但是新的非本机的客户端连接是无法连接到数据库服务器的,因为监听停止了啊。
这个话题扯多了。我们还是谈谈pga吧。pga的内容因专用模式和共享服务器模式的差异而不同。我们一般讨论的是专用服务器模式。pga包含sql区域(绑定信息,运行时内存结构)和session信息等。
所有的服务器进程占用的pga的总和被称为pga合计。在oracle9之前,pga的分配主要是通过以下几个参数控制的sort_area_size,hash_area_size,bitmap_merge_size,create_bitmap_area_size。从oracle9开始开始提供了pga的内存自动化管理:自动化sql执行管理。为此oracle引入了如下的参数:pga_aggregate_target:该参数执行所有的会话可以使用的最大的pga的值。
work_area_size_policy:auto/manual,当设置为munual时,就使用oracle9以前的管理方式。
在oracle内部算法中,pga_aggregate_target参数影响着针对单个会话的pga的分配:
1)一般情况下,单个sql操作能够使用的pga按照如下的原则分配
min(5%*pga_aggregate_target,100M)也就是当内存小于100M/5%=100*20=2000M差不多2G。
2)对于并行操作
30%*pga_aggregate_target/dop (dop=degree of parallelism并行度)
要理解pga的自动调整,还要区分可调整与不可调整内存。可以调整是sql工作区,而其它的部分是不可调整。即使使用了自动调整,那么oracle还需要满足:可调整 + 不可调整 <= pga_aggregate_target。

pga_aggregate_target参数还会在cbo模式下,对sql的执行计划产生影响,oracle根据该参数评估sql在执行过程中需要的sort,hash等操作使用的最大或者最小内存,从而选在一个最优的执行计划。
一般设置方法如下,oracle Mem(操作系统的内存 * 70%) = sga + pga
oltp:oracle MEM*20%
olap:oracle MEM*50%
sql在工作区中的工作方式为以下三种:
optimal(最大优化方式):在内存中完成所有的操作
onepass:大部分操作在内存中完成,但是用到磁盘操作
mutipass:大量操作产生磁盘交互
对于pga的优化目标就是使得optimal的操作尽量的提高,也就是尽量在内存中完成排序操作,尽量减低磁盘交互。通过如下sql查询:
Select Name,Value,
100*Value/
decode((Select Sum(t.VALUE) From v$sysstat t
Where t.Name Like 'workarea executions%'),0,Null,
(Select Sum(t.VALUE) From v$sysstat t
Where t.Name Like 'workarea executions%')
) pct
From v$sysstat Where Name Like 'workarea executions%'
NAME    VALUE                        PCT
------------------------------------------
workarea executions - optimal 1525 100
workarea executions - onepass 0 0
workarea executions - multipass 0 0
一般的指标为workarea executions - optimal > 90%
v$pgastat视图
global memory bound代表了数据库允许使用的最高的pga内存使用量,符合上述的公式。
v$sql_workarea与v$sql视图的联合查询
select sql_text,operation_type,last_memory_used/1024/1024,last_execution,last_tempseg_size
from v$sql l,v$sql_workarea a
where l.hash_value = a.hash_value
通过上述语句可以查询出,每条sql的内存的大小以及是否使用了磁盘临时段。

pga的调整建议
select t.PGA_TARGET_FOR_ESTIMATE/1024/1024 PGAMB,t.PGA_TARGET_FACTOR SizeFactor,
t.ESTD_PGA_CACHE_HIT_PERCENTAGE cachehit,t.ESTD_OVERALLOC_COUNT overalloccount
from v$pga_target_advice t
overalloccount:表示什么时候可以消除pga过载
cachehit:表示pga的命中率
SizeFactor:1表示为当前的大小设置
一般建议设置为命中率最高并且过载最低的设置。
最后说下其实pga单个sql工作区最大值为100M,其实是受一个隐含参数的影响_pga_max_size。
select x.inst_id,x.indx+1,ksppinm,ksppity,ksppstvl,ksppstdf,
decode(bitand(ksppiflg/256,1),1,'TRUE','FALSE'),
decode(bitand(ksppiflg/65536,3),1,'IMMEDIATE',2,'DEFERRED',
3,'IMMEDIATE','FALSE'), decode(bitand(ksppstvf,7),1,'MODIFIED',4,'SYSTEM_MOD','FALSE'),
decode(bitand(ksppstvf,2),2,'TRUE','FALSE'), ksppdesc, ksppstcmnt
from x$ksppi x, x$ksppcv y
where (x.indx = y.indx) and ( (translate(ksppinm,'_','#') like '#%') )
该参数的一半值为100M。
 
 
阅读(984) | 评论(0) | 转发(0) |
0

上一篇:AIX命令

下一篇:怪现象

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