ITPub博客

首页 > Linux操作系统 > Linux操作系统 > PGA (Program Global Area)

PGA (Program Global Area)

原创 Linux操作系统 作者:tolywang 时间:2010-07-05 16:25:03 0 删除 编辑

PGA (Program Global Area) 

解析SQL语句是在共享内存shared pool的library cache中完成的。那么SQL语句中传入的绑定变量,排序,
hash连接, session相关管理控制信息,与每个session相关的一些内存分配问题是在哪里完成的呢 ?

Oracle引入PGA来进行解决,PGA即Program Global Area(官方解释),也称为process global area,该内
存区域包含了与某个特定server process相关的数据和控制信息,每个process都有自己私有的PGA区,由
于这块区域是私有的,所以不需要任何latch的保护。

OLTP类型: 80% SGA, 20% PGA.
DSS 类型: 50% SGA, 50% PGA.
混合类型: 60% SGA, 40% PGA,当然以上分配都需要后期监控调整。

相关视图: v$pga_target_advice , statistics_level=typical/all

PGA中包含了当前进程所使用的有关操作系统资源的信息(比如打开的文件句柄等)以及一些与当前进程
相关的一些私有的状态信息。

Fixed PGA:     这部分包含一些小的固定尺寸的变量,以及指向变化PGA部分的指针。
Variable PGA :   这部分是按照堆来进行组织的,所以这部分也叫做PGA堆,PGA堆中包含的内存结构:
A. 一些固定表的永久性内存;
B. 如果session是专用连接(dedicated)方式,还含有用户全局区(UGA)子堆,如果用户是共享连接
(Shared Server), 则UGA位于SGA中(在large pool中分配)。  
C. 调用全局区子堆(CGA)。

 

UGA(用户全局区) : UGA是包含与某个特定session相关信息的内存区域,比如session的登录信息以
及session私有的SQL区域等。每个UGA也包含以下两个部分:
A. 固定UGA部分(Fixed UGA):这部分包含一些小的固定尺寸的变量,以及指向变化UGA部分的指针。
B. 变化UGA部分(Variable UGA):这部分也是按照堆来进行组织的,可以从X$KSMUP视图中看到有关
UGA堆的分布情况。UGA堆的分布与open_cursors、open_links等参数有关系。所谓的游标(cursor)
就是放在这里的,游标指向shared pool里的包含SQL文本以及执行计划等的对象.

UGA堆的内存结构:
(a). 私有SQL区域(Private SQL Area):这部分区域包含绑定变量信息以及运行时的内存结构等数据。
每一个发出SQL语句的session都有自己的私有SQL区域。这部分区域又可分成以下两部分。
   (a1). 永久内存区域:这里存放了相同SQL语句多次执行时都需要的一些游标信息,比如绑定变量
         信息、数据类型转换信息等。这部分内存只有在游标被关闭时才会被释放。
   (a2). 运行时区域:在处理SQL语句时的第一步就是要创建运行时区域,这里存放了当SQL语句运行
         时所使用的一些信息。对于DML(INSERT、UPDATE、DELETE)语句来说,SQL语句执行完毕就
         释放该区域;而对于查询语句(SELECT)来说,则是在所有数据行都被获取并传递给用户以
         后被释放,或者该查询被取消以后也会被释放。

(b). Session相关的信息。这部分信息包括以下几部分
   (b1). 正在使用的包(package)的状态信息。
   (b2). 使用alter session这样的命令所启用的跟踪信息,或者所修改的session级别的优化器参数
     (optimizer_mode)、排序参数(sort_area_size等)、修改的NLS参数等。
   (b3). 所打开的db links。
   (b4). 可使用的角色(roles)等。

(c). 工作区(Work area): 这块区域主要用来存放执行SQL的过程中所产生的中间数据,比如排序时,
    需要在这里存放排序过程中的中间数据。这部分占据了PGA中的大部分空间。其大小依赖于所要处理
    的SQL语句的复杂程度而定。如果SQL语句包含诸如group by、hash-join等这样的操作,则会需要很
    大的SQL工作区域。实际上,我们调整PGA也就是调整这块区域。


UGA所处的位置完全由session连接的方式决定:
a. 如果session是通过共享服务器(shared server)方式登录到数据库的,则毫无疑问,UGA必须能
   够被所有进程访问,所以在这种情况下,UGA是从SGA中进行分配的。进一步说,如果SGA中设置了
   large pool,则UGA从large pool里进行分配;否则,如果没有设置large pool,则UGA只能从shared
   pool里进行分配。
b. 如果session是通过专用服务器(dedicated server)方式登录到数据库的,则UGA是从进程的PGA中
   进行分配的。

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

下一篇: PGA自动管理
请登录后发表评论 登录
全部评论
Oracle , MySQL, SAP IQ, SAP HANA, PostgreSQL, Tableau 技术讨论,希望在这里一起分享知识,讨论技术,畅谈人生 。

注册时间:2007-12-10

  • 博文量
    5595
  • 访问量
    14695548