首页 > Linux操作系统 > Linux操作系统 > 浅说Oracle PGA空间管理
Oracle实例是Oracle Server的重要组成部分,理论上包括一块共享内存(Shared Memory)和一系列后台进程(Background Process)。远程Remote客户端通过在服务器端的代理Server Process与Oracle 实例进行通信交互。在每一个Server Process上,都对应一块私有的内存空间,我们称之为Private Global Area(简称为PGA)空间。本篇中,我们就简单介绍一下PGA的组成和管理细节。
1、PGA组成和功能
PGA是Server Process对应的私有空间,其中保存的都是与会话相关的数据和相关信息。PGA中,主要包括全局变量、数据结构和控制信息。比如我们常说的Session Cursor,就是在执行一个SQL的时候生成在PGA空间中,与SGA中Shared Cursor对应的SQL执行体。
在空间使用上,session cursor使用的PGA比较少。很多时候,Oracle的性能好坏是与PGA大小配置密切相关。在运行一些长时间执行、操作结果集合很大的SQL时,Oracle是会将处理的数据集和中间结果集合转移到Server Process的私有空间——PGA中进行处理。在笔者过去的一些文章中,也介绍过Hash、Group by和Sort等操作对PGA的空间使用情况。在Oracle中,对PGA中这样的空间称之为Work Area。
Work Area的大小设置是和Oracle性能密切相关。在Work Area的具体组成上,有几个比较需要关注的部分:hash_area、sort_area和bitmap_area。
SQL> show parameter hash_area
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
hash_area_size integer 131072
SQL> show parameter sort_area
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sort_area_retained_size integer 0
sort_area_size integer 65536
SQL> show parameter bitmap
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
bitmap_merge_area_size integer 1048576
create_bitmap_area_size integer 8388608
其中,hash_area是Oracle对SQL进行连接操作(主要是hash join)时,将进行hash函数计算过的bucket集合进行存储的位置。而sort_area表示SQL中进行order by等聚集操作的结果集合场所。
通常情况下,我们都希望SQL执行所需要的中间结果在Work Area的特定区域中可以容纳。因为PGA对应的是内存区域,进行数据处理和保存的速度要远快于磁盘处理速度。当SQL执行所需要的空间小于work area时候,SQL执行的速度就会很快。但是如果SQL需要空间大于Work Area时,Oracle就会使用Temp表空间的空间进行“置换”操作。这个过程要涉及到比较复杂的计算和存储过程,所以一旦出现这样的“multi-pass”过程,SQL执行的效率通常是较低,响应时间也随之增加。
2、PGA空间管理
由于PGA各个组成部分,特别是work_area对SQL执行效率的影响,所以各部分的tunning是早期Oracle DBA一个比较头疼的问题。
在Oracle 8i以及以前,DBA需要对系统的PGA进行仔细的调节,评估整个应用系统最佳使用情况。调节的方法主要是对Oracle初始化参数的调节,主要有sore_area_size、hash_area_size、bitmap_merge_area_size和create_bitmap_area_size等。
进入Oracle 9i后,一场持续Oracle多个版本的革命开始,Oracle开始提供一种自动调节PGA的功能。DBA只需要指定一个初始化参数pga_aggregate_target,作为从数据库服务器角度希望分配给所有Server Process的PGA总和大小。
SQL> show parameter pga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 194M
一旦设置了pga_aggregate_target参数,就意味着规定Oracle实例在分配给所有Server process PGA空间的时候,总分配量不要超过这个参数值。但是注意,这个参数是一个target,有一些情况下,Oracle分配的Server process PGA总和是会超过这个target值的。但是总的来说,Oracle在调整时会尽量围绕这个规划值进行调整。
此外,要开启自动的SQL执行空间管理,还要设置workarea_size_policy初始化参数。
SQL> show parameter workarea
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
workarea_size_policy string AUTO
当该参数被设置为auto之后,和pga_aggregate_target结合使用就起到了自动调节PGA的作用。与该auto取值对应的workarea_size_policy取值为manual,也就是过去一直使用的手工调整方法。
针对不同的数据库实例情况,主要是应用负载和应用并发Server Process,可以说每个实例调整值都是不同的,都存在各自独特的最优值。从9iR2开始,Oracle同时推出了Advisor组件功能,对一些如buffer_cache、PGA等提出了最优化建议,最为DBA进行实际设置时候的重要参考。
3、历代Oracle的PGA设置变化
从Oracle 9i开始,PGA自动配置调整就成为Oracle PGA设置的一种主要方式。DBA不再过多关注PGA内部各个区划分的大小问题,而是只需要站在Database Server角度,看分配给所有PGA的内存空间大小就可以了。各个分区大小都是通过Oracle自适应的过程进行调节。
注意,在9iR2中,自动进行PGA空间调节的功能只针对独占连接模式(Dedicated Server Connections),对于共享连接模式(Shared Connections)来说不其效果。
到了10g,上面的限制被打破,自动PGA管理调节支持所有种类的连接模式。11g之后,经历两个版本成熟过程的Oracle将自动存储管理(Automatic Memory Management AMM)拓展覆盖了SGA和PGA。也就是说,DBA只要设置一个Memory_Target参数,指定Oracle Database Server一共需要使用多少的内存资源,剩下的分配和调节都是交给Oracle去进行。
不过,在11g环境下,官方推介还是对参数pga_aggregate_target设置一个较小的取值,用来保证最小的PGA总分配量。在使用Memory_Target的情况下,Oracle会依据负载和并发Server的情况将空间在PGA和SGA进行分配,很多情况下有可能出现SGA延展过大的情况,所以设置一个较小的pge取值,可以保证系统正常运行。
4、结论
Oracle PGA是实例的一个重要部分,也是我们进行调优和内部结构研究的重要组成。从Oracle 9i开始推行的AMM,很大程度上减轻了DBA的监控和调整压力,使Oracle数据库开始进入自适应调优时代。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/17203031/viewspace-708788/ ,如需转载,请注明出处,否则将追究法律责任。