暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle内存结构研究-PGA

原创 大汉_客家族_小凡仙 2022-10-27
440

Oracle PGA参数

PGA: 程序全局区,服务器进程使用的内存区域,包括特定服务器进程的数据和控制信息,例如使用的操作系统资源等。
UGA: 用户全局区,特定Session使用的内存区域,例如Session的SQL工作区、登陆认证信息等。Session的SQL工作区大小对查询性能的影响 比较关键,shared server模式时UGA从SGA的large pool(如果有设置)或者shared pool(没有设置large pool)中分配,dedicated server模式时UGA从PGA中分配。
CGA: 调用全局区,存放调用过程中需要的数据,例如parse调用、executive调用、fetch调用等。调用过程中实际需要的数据,例如SQL Area、Sort Area等位于UGA中,CGA存放的只是调用过程中的临时处理数据,例如I/O缓存、临时堆栈空间等。CGA位于PGA中(PGA是集中管理这些资源的 地方),在调用开始时创建,调用执行过程中动态分配,调用结束后释放。

WORKAREA_SIZE_POLICY = { AUTO | MANUAL } { ALTER SYSTEM | ALTER SESSION } SET WORKAREA_SIZE_POLICY = { AUTO | MANUAL }
复制

设为AUTO时,内存使用比较多的SQL操作,例如sort, group-by, hash-join, bitmap merge和bitmap create等,由Oracle自动分配;设为MANUAL时,这些操作将使用相应的*_AREA_SIZE参数设置的内存值。
*_AREA_SIZE作用于每个Session,分配的过小,很多Session可能没有足够的内存而效率低下,分配过多,大量Session可能浪费 掉很多内存空间,9i开始的PGA自动管理功能改善了这个状况。使用PGA_AGGREGATE_TARGET设置整个PGA大小,Oracle将为每个 Session按照实际需要为其分配PGA,并尽量维持PGA总量不超过PGA_AGGREGATE_TARGET值。

PGA_AGGREGATE_TARGET = integer [K | M | G] ALTER SYSTEM
复制

设定总的PGA内存大小。Oracle将尽量保证PGA内存总合不超过这个值,但不是绝对的,为了避免磁盘操作,有时可能会超过这个值。可以设置为总的内存数减去SGA的剩余值。
将该初始化参数设置为大于0的值,Oracle自动将WORKAREA_SIZE_POLICY设为AUTO;将该初始化参数设置为0,Oracle自动 将WORKAREA_SIZE_POLICY设为MANUAL。设置了PGA_AGGREGATE_TARGET之后,会忽略所有*_AREA_SIZE 设置。

HASH_AREA_SIZE = Integer ALTER SESSION 单位为字节数。 SORT_AREA_SIZE = Integer ALTER SESSION, ALTER SYSTEM ... DEFERRED 单位为字节数。
复制

如果没有设置SORT_AREA_RETAINED_SIZE,分配的内存在排序结束,开始返回记录之前释放,如果设置了 SORT_AREA_RETAINED_SIZE,分配的内存在最后一条记录返回后释放。位图索引上的插入、更新也会用到 SORT_AREA_SIZE(因为扫描完索引之后必须对各个位图进行排序,然后再合并成一个位图)。

SORT_AREA_RETAINED_SIZE = Integer
ALTER SESSION, ALTER SYSTEM … DEFERRED
单位为字节数。指在UGA中保留的排序内存大小,排序操作结束,返回最后一条记录之后释放排序内存,只是释放给UGA,而不是操作系统。

BITMAP_MERGE_AREA_SIZE,CREATE_BITMAP_AREA_SIZE,位图索引创建、更新时使用的内存配置。

监控、改善PGA设置

监控PGA的视图:vsql_workarea_active、vsql_workarea、vsesstat、vprocess、vsysstat、vsql_workarea_histogram等。
使用下面的视图查看Oracle建议的评估设置:

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
复制

选出的4个列中,Over alloc count指示Oracle SQL工作区内存分配的三种情况:optimal完全可以在内存中完成操作;onepass需要进行一次磁盘交换;multipass需要进行多次磁盘交换。第四列的值就是需要进行磁盘交换的数量。
PGA_AGGREGATE_TARGET的值最好选择: Over alloc count为0、Cache Hit(%)尽可能高、Extra Read/Write尽可能低的Estimate PGA Target值。

1) PGA_AGGREGATE_TARGET是一个目标值。连接数少的时候实际分配PGA内存会比它要小。连接数多的时候实际分配的PGA内存会比它要大,但是Oracle会努力保持总PGA保持在PGA_AGGREGATE_TARGET值内。
   例如,PGA_AGGREGATE_TARGET 设为300MB。5个用户连接时,每个用户可能分配10MB的PGA内存,共分配50MB的PGA内存。300个用户连接时每个用户可能分配1.3MB的 PGA内存,共分配390MB的PGA内存。当用户连接多时,Oracle会降低每个用户的PGA内存使用量。
  2) 一个串行查询(非并行查询)可能包括多个排序/散列操作,每个排序/散列操作最多使用5%的PGA内存。
  3) 一个并行查询最多可用到30%的PGA内存,无论有多少并行进程
 b)自动PGA内存管理会根据当前空闲内存来进行分配。当空闲内存为300MB,当前用户需要10MB内存进行排序,Oracle就会分配10MB内存给当前用户。
 b)自动PGA内存管理会根据当前连接情况进行分配。如果物理内存总量为1G,PGA_AGGREGATE_TARGET为300MB,当用户数从10升到 300时,每个用户连接的内存会从满足需要的10MB慢慢减少到1.3MB,虽然最后总量也会超过PGA_AGGREGATE_TARGET,但比起手动 PGA内存管理要好很多了。

预备知识

PGA(Process Global Area),是server process一段私有内存区,它包含有全局变量,数据结构和一些控制信息。在Oracle8i 中,PGA调整非常复杂,要调整SORT_AREA_SIZE、HASH_AREA_SIZE、BITMAP_MERGE_AREA_SIZE、 CREATE_BITMAP_AREA_SIZE等参数。在ORACLE9I中,只需要调整 PGA_AGGREGATE_TARGET。

PGA_AGGREGATE_TARGET初始化设置

PGA_AGGREGATE_TARGET的值应该基于Oracle实例可利用内存的总量来设置,这个参数可以被动态的修改。假设Oracle实例可分配 4GB的物理内存,剩下的内存分配给操作系统和其它应用程序。你也许会分配80%的可用内存给Oracle实例,即3.2G。现在必须在内存中划分SGA 和PGA区域。

在OLTP系统中,典型PGA内存设置应该是总内存的较小部分(例如20%),剩下80%分配给SGA。
OLTP:PGA_AGGREGATE_TARGET = (total_mem * 80%) * 20%

在DSS系统中,由于会运行一些很大的查询,典型的PGA内存最多分配70%的内存。
DSS:PGA_AGGREGATE_TARGET = (total_mem * 80%) * 50%

在这个例子中,总内存4GB,DSS系统,你可以设置PGA_AGGREGATE_TARGET为1600MB,OLTP则为655MB。

–配置PGA自动管理

不用重启DB,直接在线修改。

SQL> alter system set workarea_size_policy=auto scope=both; System altered. SQL> alter system set pga_aggregate_target=512m scope=both; System altered. SQL> show parameter workarea NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ workarea_size_policy string AUTO --这个设置成AUTO SQL> show parameter pga NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ pga_aggregate_target big integer 536870912 SQL>
复制

监控自动PGA内存管理的性能

V$PGASTAT:这个视图给出了一个实例级别的PGA内存使用和自动分配的统计。

SQL> set lines 256 SQL> set pages 42 SQL> SELECT * FROM V$PGASTAT; NAME VALUE UNIT ---------------------------------------------------------------- ---------- ------------ aggregate PGA target parameter 536870912 bytes --当前PGA_AGGREGATE_TARGET的值 aggregate PGA auto target 477379584 bytes --当前可用于自动分配了的PGA大小,不应该比PGA_AGGREGATE_TARGET 小 global memory bound 26843136 bytes --自动模式下工作区域的最大大小,Oracle根据工作负载自动调整。 total PGA inuse 6448128 bytes total PGA allocated 11598848 bytes --PGA的最大分配 maximum PGA allocated 166175744 bytes total freeable PGA memory 393216 bytes --PGA的最大空闲大小 PGA memory freed back to OS 69074944 bytes total PGA used for auto workareas 0 bytes --PGA分配给auto workareas的大小 maximum PGA used for auto workareas 1049600 bytes total PGA used for manual workareas 0 bytes maximum PGA used for manual workareas 530432 bytes over allocation count 1118 --实例启动后,发生的分配次数,如果这个值大于0,就要考虑增加pga的值 bytes processed 114895872 bytes extra bytes read/written 4608000 bytes cache hit percentage 96.14 percent --命中率 16 rows selected. --V$PGA_TARGET_ADVICE SQL> SELECT round(PGA_TARGET_FOR_ESTIMATE/1024/1024) target_mb, ESTD_PGA_CACHE_HIT_PERCENTAGE cache_hit_perc, ESTD_OVERALLOC_COUNT FROM v$pga_target_advice; The output of this query might look like the following: TARGET_MB CACHE_HIT_PERC ESTD_OVERALLOC_COUNT ---------- -------------- -------------------- 63 23 367 125 24 30 250 30 3 375 39 0 500 58 0 600 59 0 700 59 0 800 60 0 900 60 0 1000 61 0 1500 67 0 2000 76 0 3000 83 0 4000 85 0
复制

可以看出当TARGET_MB 为375M是ESTD_OVERALLOC_COUNT=0,所以我们可以将PGA_AGGREGATE_TARGET设置成375M。

–End–

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论