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