Oracle PGA参数
生活随笔
收集整理的這篇文章主要介紹了
Oracle PGA参数
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
PGA: 程序全局區(qū),服務器進程使用的內存區(qū)域,包括特定服務器進程的數(shù)據(jù)和控制信息,例如使用的操作系統(tǒng)資源等。
UGA: 用戶全局區(qū),特定Session使用的內存區(qū)域,例如Session的SQL工作區(qū)、登陸認證信息等。Session的SQL工作區(qū)大小對查詢性能的影響比較關鍵,shared server模式時UGA從SGA的large pool(如果有設置)或者shared pool(沒有設置large pool)中分配,dedicated server模式時UGA從PGA中分配。
CGA: 調用全局區(qū),存放調用過程中需要的數(shù)據(jù),例如parse調用、executive調用、fetch調用等。調用過程中實際需要的數(shù)據(jù),例如SQL Area、Sort Area等位于UGA中,CGA存放的只是調用過程中的臨時處理數(shù)據(jù),例如I/O緩存、臨時堆棧空間等。CGA位于PGA中(PGA是集中管理這些資源的地方),在調用開始時創(chuàng)建,調用執(zhí)行過程中動態(tài)分配,調用結束后釋放。
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參數(shù)設置的內存值。
*_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內存總合不超過這個值,但不是絕對的,為了避免磁盤操作,有時可能會超過這個值。可以設置為總的內存數(shù)減去SGA的剩余值。
將該初始化參數(shù)設置為大于0的值,Oracle自動將WORKAREA_SIZE_POLICY設為AUTO;將該初始化參數(shù)設置為0,Oracle自動將WORKAREA_SIZE_POLICY設為MANUAL。設置了PGA_AGGREGATE_TARGET之后,會忽略所有*_AREA_SIZE設置。
HASH_AREA_SIZE = Integer
ALTER SESSION
單位為字節(jié)數(shù)。
SORT_AREA_SIZE = Integer
ALTER SESSION, ALTER SYSTEM ... DEFERRED
單位為字節(jié)數(shù)。如果沒有設置SORT_AREA_RETAINED_SIZE,分配的內存在排序結束,開始返回記錄之前釋放,如果設置了SORT_AREA_RETAINED_SIZE,分配的內存在最后一條記錄返回后釋放。位圖索引上的插入、更新也會用到SORT_AREA_SIZE(因為掃描完索引之后必須對各個位圖進行排序,然后再合并成一個位圖)。
SORT_AREA_RETAINED_SIZE = Integer
ALTER SESSION, ALTER SYSTEM ... DEFERRED
單位為字節(jié)數(shù)。指在UGA中保留的排序內存大小,排序操作結束,返回最后一條記錄之后釋放排序內存,只是釋放給UGA,而不是操作系統(tǒng)。
BITMAP_MERGE_AREA_SIZE,CREATE_BITMAP_AREA_SIZE,位圖索引創(chuàng)建、更新時使用的內存配置。
_pga_max_size: Maximum size of the PGA memory for one process。ALTER SYSTEM。默認值200M。
查看_pga_max_size值的方法:
select ksppinm "Name", ksppstvl/1024/1024 ||'M' "Value", ksppdesc "Desc"
from x$ksppi x, x$ksppcv y
where x.indx = y.indx and ksppinm ='_pga_max_size';
_smm_max_size: Maximum work area size in auto mode (serial)。{ALTER SESSION | ALTER SYSTEM}。
網(wǎng)上有很多描述_smm_max_size默認值的說法,其實都不對,追究其算法也沒多少意義,反正如果你沒有手動設置過_smm_max_size的值,一旦設置_pga_max_size或者PGA_AGGREGATE_TARGET,Oracle就會自動計算出_smm_max_size的值,如果手動設置過_smm_max_size則不會變化,Oracle自動計算出的_smm_max_size值,跟PGA_AGGREGATE_TARGET和_pga_max_size都有關系。查看_smm_max_size值的方法如下:
select ksppinm "Name", ksppstvl/1024 ||'M' "Value", ksppdesc "Desc"
from x$ksppi x, x$ksppcv y
where x.indx = y.indx and ksppinm ='_smm_max_size';
使用PGA_AGGREGATE_TARGET讓Oracle自動分配PGA時,為了防止單個Session占用過多內存而導致整個服務器性能下降,這兩個隱藏參數(shù)控制了單個進程的最大內存使用量。
這兩個參數(shù)為隱藏參數(shù),Oracle官方不進行技術支持,如果系統(tǒng)中存在大量的HASH JOIN、SORT等耗費內存的操作,可以考慮、測試這些參數(shù)對系統(tǒng)性能的影響,但注意其副作用。
沒有使用并行查詢時,單個Session SQL工作區(qū)內存使用最大值為min( 5%*PGA_AGGREGATE_TARGET , 50%*_pga_max_size , _smm_max_size)。
設置_pga_max_size: Alter System Set "_pga_max_size"=1024M。
設置_smm_max_size: Alter System Set "_smm_max_size"=307200,單位是K,只能以這種單位進行設置,數(shù)字后面不能使用K、M、G這些單位字符了。
監(jiān)控、改善PGA設置
監(jiān)控PGA的視圖:v$sql_workarea_active、v$sql_workarea、v$sesstat、v$process、v$sysstat、v$sql_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工作區(qū)內存分配的三種情況:optimal完全可以在內存中完成操作;onepass需要進行一次磁盤交換;multipass需要進行多次磁盤交換。第四列的值就是需要進行磁盤交換的數(shù)量。
PGA_AGGREGATE_TARGET的值最好選擇: Over alloc count為0、Cache Hit(%)盡可能高、Extra Read/Write盡可能低的Estimate PGA Target值。
UGA: 用戶全局區(qū),特定Session使用的內存區(qū)域,例如Session的SQL工作區(qū)、登陸認證信息等。Session的SQL工作區(qū)大小對查詢性能的影響比較關鍵,shared server模式時UGA從SGA的large pool(如果有設置)或者shared pool(沒有設置large pool)中分配,dedicated server模式時UGA從PGA中分配。
CGA: 調用全局區(qū),存放調用過程中需要的數(shù)據(jù),例如parse調用、executive調用、fetch調用等。調用過程中實際需要的數(shù)據(jù),例如SQL Area、Sort Area等位于UGA中,CGA存放的只是調用過程中的臨時處理數(shù)據(jù),例如I/O緩存、臨時堆棧空間等。CGA位于PGA中(PGA是集中管理這些資源的地方),在調用開始時創(chuàng)建,調用執(zhí)行過程中動態(tài)分配,調用結束后釋放。
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參數(shù)設置的內存值。
*_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內存總合不超過這個值,但不是絕對的,為了避免磁盤操作,有時可能會超過這個值。可以設置為總的內存數(shù)減去SGA的剩余值。
將該初始化參數(shù)設置為大于0的值,Oracle自動將WORKAREA_SIZE_POLICY設為AUTO;將該初始化參數(shù)設置為0,Oracle自動將WORKAREA_SIZE_POLICY設為MANUAL。設置了PGA_AGGREGATE_TARGET之后,會忽略所有*_AREA_SIZE設置。
HASH_AREA_SIZE = Integer
ALTER SESSION
單位為字節(jié)數(shù)。
SORT_AREA_SIZE = Integer
ALTER SESSION, ALTER SYSTEM ... DEFERRED
單位為字節(jié)數(shù)。如果沒有設置SORT_AREA_RETAINED_SIZE,分配的內存在排序結束,開始返回記錄之前釋放,如果設置了SORT_AREA_RETAINED_SIZE,分配的內存在最后一條記錄返回后釋放。位圖索引上的插入、更新也會用到SORT_AREA_SIZE(因為掃描完索引之后必須對各個位圖進行排序,然后再合并成一個位圖)。
SORT_AREA_RETAINED_SIZE = Integer
ALTER SESSION, ALTER SYSTEM ... DEFERRED
單位為字節(jié)數(shù)。指在UGA中保留的排序內存大小,排序操作結束,返回最后一條記錄之后釋放排序內存,只是釋放給UGA,而不是操作系統(tǒng)。
BITMAP_MERGE_AREA_SIZE,CREATE_BITMAP_AREA_SIZE,位圖索引創(chuàng)建、更新時使用的內存配置。
_pga_max_size: Maximum size of the PGA memory for one process。ALTER SYSTEM。默認值200M。
查看_pga_max_size值的方法:
select ksppinm "Name", ksppstvl/1024/1024 ||'M' "Value", ksppdesc "Desc"
from x$ksppi x, x$ksppcv y
where x.indx = y.indx and ksppinm ='_pga_max_size';
_smm_max_size: Maximum work area size in auto mode (serial)。{ALTER SESSION | ALTER SYSTEM}。
網(wǎng)上有很多描述_smm_max_size默認值的說法,其實都不對,追究其算法也沒多少意義,反正如果你沒有手動設置過_smm_max_size的值,一旦設置_pga_max_size或者PGA_AGGREGATE_TARGET,Oracle就會自動計算出_smm_max_size的值,如果手動設置過_smm_max_size則不會變化,Oracle自動計算出的_smm_max_size值,跟PGA_AGGREGATE_TARGET和_pga_max_size都有關系。查看_smm_max_size值的方法如下:
select ksppinm "Name", ksppstvl/1024 ||'M' "Value", ksppdesc "Desc"
from x$ksppi x, x$ksppcv y
where x.indx = y.indx and ksppinm ='_smm_max_size';
使用PGA_AGGREGATE_TARGET讓Oracle自動分配PGA時,為了防止單個Session占用過多內存而導致整個服務器性能下降,這兩個隱藏參數(shù)控制了單個進程的最大內存使用量。
這兩個參數(shù)為隱藏參數(shù),Oracle官方不進行技術支持,如果系統(tǒng)中存在大量的HASH JOIN、SORT等耗費內存的操作,可以考慮、測試這些參數(shù)對系統(tǒng)性能的影響,但注意其副作用。
沒有使用并行查詢時,單個Session SQL工作區(qū)內存使用最大值為min( 5%*PGA_AGGREGATE_TARGET , 50%*_pga_max_size , _smm_max_size)。
設置_pga_max_size: Alter System Set "_pga_max_size"=1024M。
設置_smm_max_size: Alter System Set "_smm_max_size"=307200,單位是K,只能以這種單位進行設置,數(shù)字后面不能使用K、M、G這些單位字符了。
監(jiān)控、改善PGA設置
監(jiān)控PGA的視圖:v$sql_workarea_active、v$sql_workarea、v$sesstat、v$process、v$sysstat、v$sql_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工作區(qū)內存分配的三種情況:optimal完全可以在內存中完成操作;onepass需要進行一次磁盤交換;multipass需要進行多次磁盤交換。第四列的值就是需要進行磁盤交換的數(shù)量。
PGA_AGGREGATE_TARGET的值最好選擇: Over alloc count為0、Cache Hit(%)盡可能高、Extra Read/Write盡可能低的Estimate PGA Target值。
轉載于:https://www.cnblogs.com/RicCC/archive/2008/01/06/1027524.html
總結
以上是生活随笔為你收集整理的Oracle PGA参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员入职后千万不要沾沾自喜,不注意这一
- 下一篇: 简单实现分行输出的javascript代