我是靠谱客的博主 顺利音响,最近开发中收集的这篇文章主要介绍PGA的设置与调整,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

PGA,即程序全局区(Program Global Area),是Oracle体系机构的重要组成部分。Oracle 数据库对系统内存的总开销即是PGA+SGA。SGA主
要由库缓存(共享SQL区和PL/SQL区)和数据字典缓存组成。而PGA包含客户端连接服务器所派生的服务器进程的集合,每个服务器进程都拥有存放
数据和控制信息的私有内存区域。客户端进程和服务器端进程一一对应,由服务器端进程完成用户的请求,并将数据返回给客户端进程。

一、PGA的主要特性及结构
1、主要特性
不同于SGA,此部分为非共享的内存
服务器进程启动或创建时分配,结束时释放,只能被一个进程使用(在系统运行时,排序,连接等操作可能需要进一步的PGA分配)
PGA的内容随服务器的模式(专用模式/共享服务器模式)不同而不用
所有服务器进程分配的PGA总和通常被称为PGA合计(Aggregated PGA),该值由由参数:pga_aggregate_target 决定

2、PGA的结构
PGA包括了以下几个结构:
排序区(Sort)
游标状态区(Cursor)
会话信息区(Session)
堆栈区(Stack)
PGA=UGA+排序区+散列区+位图合并区

3、UGA
与PGA相关的另一概念即是UGA(User Global Area),即用户全局区,与特定的会话相关联。
专用服务器连接模式,UGA在PGA中分配。
  共享服务器连接模式,UGA在SGA中的Large Pool中分配。
  如果采用专用服务器连接模式,PGA中包含UGA,其他区域用来排序,散列和位图合并。

4、导致排序的常用操作(耗用sort_area_size)
ORDER BY,GROUP BY,ROLLUP,DISTINCT
MINUS,INTERSECT,UNION
MIN(),MAX(),COUNT()
哈希连接
位图合并
位图创建
批量数据装载

二、PGA的管理模式与设置
  1、PGA分两种管理模式:
手动PGA内存管理:用户指定排序区和散列区所使用的内存,每个连接使用相同的内存。
自动PGA内存管理:告诉Oracle可以使用的PGA的总量,由Oraclce根据系统负载决定具体分配。即PGA内存可以动态扩大和回收

9iR1时默认为手动PGA内存管理,9iR2以后默认为自动PGA内存管理。

  2、PGA内存管理模式设置(参数workarea_size_policy)
设为MANUAL,使用手动管理方式。
   设为AUTO,并且pga_aggregate_target不为0时,启用自动内存管理。

3、PGA相关的参数
bitmap_merge_area_size -->位图合并区分配的值
create_bitmap_area_size -->创建位图分配的值
hash_area_size -->主要用于hash join时分配的大小
sort_area_size -->排序所用的内存总量,影响one-pass,multi-pass,optimal
sort_area_retained_size -->排序后在内存中保存排序信息的内存总量
这几个参数在Oracle 9i之前被使用,在Oracle 9i可以对这几个参数进行手动分配,亦可以由系统自动分配。
当使用workarea_size_policy为AUTO且pga_aggregate_target非零值时,上述四个参数建议根据系统自动负荷自动调整
SQL> show parameter area_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
bitmap_merge_area_size integer 1048576
create_bitmap_area_size integer 8388608
hash_area_size integer 131072
sort_area_size integer 65536
workarea_size_policy string AUTO

pga_aggregate_target
a.决定了所有session总计可使用最大PGA内存值,该参数可动态修改。连接数少时则实际分配的PGA内存通常小于target值,当连接
数多的时候则实际分配的PGA内存会超过target值。target值为尽可能保持的目标值。
b.全局PGA分配以及私有工作区分配受限于该参数
c.该参数在9i中仅支持专有服务器模式,在10g之后既支持专有服务器模式也支持共享服务器模式
d.pga_aggregate_target被分为可调整区和不可调整区,可调整区为SQL工作区,其余为不可调整区
e.当少量用户连接到数据库时,则每个用户享有相对较多的PGA内存,而当大量用户连接时则每个用户分配相对较少的PGA内存。
f.单个串行查询(非并行查询)可能包括多个排序/散列操作,每个排序/散列操作最多使用5%的PGA内存。
h.单个并行查询最多可用到30%的PGA内存,无论有多少并行进程。

SQL> select name,value,display_value
2 from v$parameter where name in ('pga_aggregate_target','workarea_size_policy');
NAME VALUE DISPLAY_VALUE
-------------------- -------------------- -------------------------
pga_aggregate_target 199229440 190M
workarea_size_policy AUTO AUTO

三、PGA 的分配原则
PGA_AGGREGATE_TARGET的值应该基于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的调整建议

view plain
  1. <p>对于PGA的监控与调整,可以通过下列视图作为参考
  2. v$pgastat
  3. v$pga_target_advice
  4. v$pga_target_advice_histogram
  5. 1、查看v$pgastat视图获得PGA的相关信息
  6. SQL>select*fromv$pgastat;
  7. NAMEVALUEUNIT
  8. --------------------------------------------------------------
  9. aggregatePGAtargetparameter199229440bytes--当前PGA_AGGREGATE_TARGET设定的值
  10. aggregatePGAautotarget127153152bytes--剩余的能被工作区(workarea)使用的内存(AUTO模式)
  11. globalmemorybound39845888bytes--单条SQL串行操作的最高PGA内存使用量(AUTO模式)
  12. totalPGAinuse62769152bytes--正被耗用的pga(包括workareapl/sql等所有占用的pga)
  13. totalPGAallocated132114432bytes--当前实例已分配的PGA内存总量
  14. maximumPGAallocated299982848bytes--PGA曾经扩张到的最大值
  15. totalfreeablePGAmemory10223616bytes--PGA的可释放的大小
  16. processcount19--当前process
  17. maxprocessescount42--最大时候的process
  18. PGAmemoryfreedbacktoOS46708359168bytes--PGA返回给操作系统的累计值
  19. totalPGAusedforautoworkareas4829184bytes--PGA分配给autoworkareas的总大小
  20. maximumPGAusedforautoworkareas39851008bytes--PGA分配给autoworkareas峰值
  21. totalPGAusedformanualworkareas0bytes
  22. maximumPGAusedformanualworkareas531456bytes
  23. overallocationcount1--使用量超过pga大小的次数
  24. bytesprocessed96178293760bytes--pga使用的字节
  25. extrabytesread/written1855111168bytes--向临时段写的字节
  26. cachehitpercentage98percent--命中率
  27. recomputecount(total)1473108
  28. -->从上面的统计信息可以看出maximumPGAallocated的值远大于aggregatePGAtargetparameter的值,且overallocationcount,
  29. -->此时应考虑增加PGAtarget的值</p><p>2、v$pga_target_advice_histogram视图
  30. 该视图可以显示各种不同排序工作区的使用情况,
  31. OPTIMAL_EXECUTIONS是不需要通过临时表空间交换的操作的次数。
  32. ONEPASS_EXECUTIONS是需要进行一次临时表空间交换的操作次数。
  33. MULTIPASSES_EXECUTIONS是需要多次临时表空间交换的操作次数。
  34. 原则上,如果100%的操作都是内存操作,是最佳的选择。如果内存不足,某些大型操作是ONEPASS的,也是可以接受的。
  35. 出现MULTIPASSES的操作会引起性能的急剧下降,此时应考虑调整PGAtarget
  36. /**************************************************/
  37. /*Author:RobinsonCheng*/
  38. /*Blog:http://blog.csdn.net/robinson_0612*/
  39. /*MSN:robinson_0612@hotmail.com*/
  40. /*QQ:645746311*/
  41. /**************************************************/
  42. SQL>SELECTLOW_OPTIMAL_SIZE/1024low_kb,(HIGH_OPTIMAL_SIZE+1)/1024high_kb,
  43. 2optimal_executionsopt_exec,onepass_executionsonepass_exec,multipasses_executionsmultipass_exec
  44. 3FROMv$sql_workarea_histogram
  45. 4WHEREtotal_executions!=0;
  46. LOW_KBHIGH_KBOPT_EXECONEPASS_EXECMULTIPASS_EXEC
  47. --------------------------------------------------------
  48. 24101351500
  49. 64128704100
  50. 128256149900
  51. 256512122200
  52. 51210246791700
  53. 102420481905700
  54. 20484096345000
  55. 4096819277040
  56. 8192163843700
  57. 3276865536270
  58. 1310722621440240
  59. LOW_KBHIGH_KBOPT_EXECONEPASS_EXECMULTIPASS_EXEC
  60. --------------------------------------------------------
  61. 262144524288040
  62. 3、从v$pga_target_advice获取pga设置的建议值
  63. SQL>selectpga_target_for_estimate/1024/1024pgamb,
  64. 2pga_target_factorp_tr_fct,
  65. 3estd_pga_cache_hit_percentagee_p_c_hit_prct,
  66. 4estd_overalloc_counte_or_cnt
  67. 5fromv$pga_target_advice;
  68. PGAMBP_TR_FCTE_P_C_HIT_PRCTE_OR_CNT
  69. --------------------------------------------
  70. 23.75.125821179
  71. 47.5.25821179
  72. 95.595233
  73. 142.5.75996
  74. 1901991
  75. 2281.2990
  76. 2661.4990
  77. 3041.6990
  78. 3421.8990
  79. 3802990
  80. 5703990
  81. 7604990
  82. 11406990
  83. 15208990
  84. --从上面的查询中可以看出当设置PGA的大小为228MB时,可以消除PGA过载的情形。</p>
  85. <spanstyle="font-family:SimSun;">4、通过V$SYSSTAT查看排序区的情况
  86. -->下面查看当前系统中optimal,onepass,multipass几种不同排序下所占的比率
  87. -->关于排序应当尽可能的为optimal,避免过多的multipass
  88. SQL>colprofileformata40
  89. SQL>SELECTnameprofile,cnt,decode(total,0,0,round(cnt*100/total,4))percentage
  90. 2FROM(SELECTname,valuecnt,(sum(value)over())totalFROMV$SYSSTATWHEREnamelike'workareaexec%');
  91. PROFILECNTPERCENTAGE
  92. ------------------------------------------------------------
  93. workareaexecutions-optimal111305499.999
  94. workareaexecutions-onepass11.001
  95. workareaexecutions-multipass00
  96. -->下面查看内存排序占总排序的比率,此值越高越好.如此值较小,应结合v$pga_target_advice考虑调整pga
  97. SQL>SELECTround(m.value/(m.value+d.value),4)*100||'%'memory_disk_sort_ratio
  98. 2FROM(SELECTvalueFROMv$sysstatWHERENAME='sorts(memory)')m,
  99. 3(SELECTvalueFROMv$sysstatWHERENAME='sorts(disk)')d;
  100. MEMORY_DISK_SORT_RATIO
  101. -----------------------------------------
  102. 100%</span>

五、PGA的调整命令
系统级更改:

  ALTER SYSTEM SET WORKAREA_SIZE_POLICY = {AUTO | MANAUL};

  ALTER SYSTEM SET PGA_AGGREGATE_TARGET=239075328;

  ALTER SYSTEM SET SORT_AREA_SIZE = 65536 SCOPE = SPFILE;-->使用AUTO方式时该参数不起作用

  ALTER SYSTEM SET HASH_AREA_SIZE = 65536 SCOPE = SPFILE;-->使用AUTO方式时该参数不起作用

  会话级更改

  ALTER SESSION SET WORKAREA_SIZE_POLICY = {AUTO | MANAUL};

  ALTER SESSION SET SORT_AREA_SIZE = 65536;-->使用AUTO方式时该参数不起作用

  ALTER SESSION SET HASH_AREA_SIZE = 65536;-->使用AUTO方式时该参数不起作用

最后

以上就是顺利音响为你收集整理的PGA的设置与调整的全部内容,希望文章能够帮你解决PGA的设置与调整所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部