oracle之pga的作用及管理

PGA可以工作在专用服务器和共享服务器模式下,两种模式下的PGA工作机制有所不同:

专用服务器(Dedicated):一个客户端连接对应一个服务器进程,适合批处理和大任务应用。

共享服务器(shared):多个客户端连接对应一个服务器进程,服务器端存在一个调度进程来管理。它适用于高并发事务量小的业务应用。

 

系统全局区(system global Area)是所有用户进程共享的一块内存区域,程序全局区(Program Global Area)也可称作用户进程全局区,他的内存在进程私有区而不是共享区。虽然PGA是一个全局区,可以把代码、全局变量和数据结构都存放在其中,但区域内的资源并不像SGA一样被所有的用户进程所共享,而是每个oracle服务器进程都只拥有属于自己的那份PGA资源,一个服务进程只能访问属于它自己的那部分PGA资源区,各个服务进程的PGA区的综合纪委实例的PGA的大小。通常PGA区由私有SQL区和回话区组成。

1、私有SQL区(private area)

私有SQL区用于存储变量及sql语句运行时的内存结构信息,当每个用户链接到实例时,都会在实例中创建一个会话,这些会话可能会在SGA区中创建一个共享SQL区,但是在PGA中可能会创建多个私有的SQL区,把一个私有的SQL区与对应的共享SQL区合并在一起,就可以获得一条SQL语句的完整缓存数据。

另外,每个会话的私有SQL区可以再分为静态区和动态区两部分。静态区的信息在回话过程中保持不变,只有当会话结束时,静态区才会被释放掉;而动态区的信息在整个会话过程中是不断变化的,一旦SQL语句指定完毕,及时会话还没结束,动态区也被释放掉。

2、会话区(session memory)

为保存会话中的变量以及其他与会话相关的信息,而分配的内存区。保存的信息包括登录信息及其他与会话相关的信息。在共享模式下,session memory是共享的。

3、SQL工作区(SQL work area)

对于复杂的查询,PGA的很大一部分将被那些内存需求很大的操作分配给SQL工作区,主要操作包括:

3.1、基于操作符的排序:group by 、order by、rollup和窗口函数,该区域的参数是SORT_AREA_SIZE

3.2、HASH哈希连接,参数是HASH_AREA_SIZE

3.3、位图合并,参数是BITMAP_MERGE_AREA_SIZE

3.4、位图创建,参数是CREATE_BITMAP_AREA_SIZE

例如一个排序操作使用sql工作区将一部分数据行在内存中排序;而一个HASH join 操作则使用工作来建立HASH表。如果这两种操作所处理的数据量比较大,那么就会将输入的数据分成一些更小的数据片,使一些数据片能够在内存中处理,而其他的就在临时表空间的磁盘上稍后处理。尽管工作区太小是,BITMAP操作不会将数据放到磁盘上处理,但是他们的复杂性和工作区大小成反比,工作区越大,这些操作越快。

假设test表有一万行数据:select * from test ;和select * from test order by id desc;

第一条语句,server process会把BLOCK一个一个调到BUFFER CACHE中,然后从BUFFER中取出一行返回一行给用户,PGA这时没有排序

第二条语句,server process把block加载到BUFFER中会返回给pga的work area,在PGA中进行排序,然后才能返回给用户。如果这时候SORT_AREA_SIZE不够大,pga会自动分配空间来加载,但是也不是不限量的,如果内存不够时,这时候就需要把一部分数据写到临时表空间,进行磁盘排序,关于这个磁盘排序的方法我也没搞明白是怎么具体的方式来排序的,如何才能更高效的用内存及磁盘来排序,有待考究。但是要记住利用磁盘来排序时发生了物理IO这种效率就很差了。

 

关于PGA的管理方式:自动管理及手动管理

从9i开始PGA就开始就支持自动管理了

show parameter area  ;

对应的参数workarea_size_policy的value 为auto即为自动管理,oracle默认自动管理,

SQL> show parameter area

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
bitmap_merge_area_size               integer     1048576
create_bitmap_area_size              integer     8388608
hash_area_size                       integer     131072
sort_area_retained_size              integer     0
sort_area_size                       integer     65536
workarea_size_policy                 string      AUTO               ----pga自动管理

查看对应work area的参数。

关于设置PGA的大小,建议先按服务器内的总内存   *80%*20%来运行一段时间,

Select pga_target_for_estimate/1024/1024 ||'M' "Estimate PGA Target"
       ,estd_pga_cache_hit_percentage "Cache Hit(%)"
       ,estd_extra_bytes_rw/1024/1024 ||'M' "Extra Read/Write"
       ,estd_overalloc_count "Over alloc count"
From v$pga_target_advice;

再结合数据库统计信息来设置PGA大小。

一般我们安装数据库如windows下创建DBCA时,可以进行选择

 

如上图所示即为分配内存空间PGA+SGA总大小为物理内存的80%,而pga和sga的大小自动分配,也可根据实际情况手动分配。 

部分参考内容https://blog.csdn.net/xinzhan0/article/details/54290392?spm=1001.2014.3001.5502

posted on 2021-10-28 22:17  小杜的学习天地  阅读(1089)  评论(0编辑  收藏  举报

导航