Posted by: wanghai
Posted on: 2003-09-04 12:24
我们都知道pga是process global area也称program global area,它是驻留在process private memory而
不是shared memory。每个process都有属于它自己的pga,其中仅包括了此process特定的信息,同时pga
不需要latch来保护因为没有别的process来访问。
pga包含两个部分:fixed pga和varible pga,固定pga包括一些变量,小的数据结构,指向varible pga
的指针等。varible pga是一个heap,它也由两个部分组成:permanent memory,subheap(包括了
uga,cga).permanent memory包括了一些fixed table,大小由初始化参数db_files,control files等决定
。下面来进入uga。
uga(user global area)可以说是pga里面最重要的组成部分,
它包括了
The persistent and runtime areas for open cursors
State information for packages, in particular package variables
Java session state
The roles that are enabled
Any trace events that are enabled
The NLS parameters that are in effect
Any database links that are open
The session's mandatory access control (MAC) label for Trusted Oracle
同时它的组成结构和pga是一样的,也包括fixed uga,varible uga(uga heap).fixed uga也包括一些
fixed table,大小由OPEN_CURSORS, OPEN_LINKS, MAX_ENABLED_ROLES等参数决定。剩下的varible uga
是我们最需要关心的地方!我们知道当我们发布一条sql语句时,需要经历
parse,optimization,execution,fetch阶段,如果找到shared sql便不用再hard parse,否则就hard
parse,等生成查询计划等就把cursor拷贝到uga一份,然后在uga开始执行,如果发现执行的时候sga里已
经把相关的cursor pageout了,那么就再从uga拷贝一份会sga,然后重新解析一次(费用小于hard parse
),也就是reloads,如果我们设置了session_cached_cursor的话,那么oracle就会直接在uga里去寻找
,而不用再拷回去重新解析。由此我们知道uga存储了private SQL,PL/SQL areas等重要信息,可能扯得
有点远了8D。我们还知道如果在mts模式下pga是在sga中分配得,其实这里说得是uga,fixed uga分配在
shared pool,uga heap 分配在large pool.下面在谈一下pga中的最后一个部分--cga。
cga(call global area)从名字看起来我们就能知道它大概的用处,它存在于每次call duration 中,包
括以下这些call
Parse an SQL statement
Execute an SQL statement
Fetch the outputs of a SELECT statement
当每次call一结束,cga的空间就被free到pga然后随着pga pageout到os。实际上包含在call中很多重要
的数据结构都存在于uga,比如private SQL and PL/SQL areas and sort areas。
大概讲了一下pga的构成,也算开了个头,欢迎大家来拍砖,也能更加清楚pga。 |