程式全局區(PGA)是包含用戶端連接配接伺服器所派生的伺服器程序的集合,每個伺服器程序都擁有存放資料和控制資訊的私有記憶體區域。用戶端程序和伺服器端程序一一對應,由伺服器端程序完成使用者的請求,并将資料傳回給用戶端程序。
例如,當一個使用者連接配接資料庫并調用SQL語句時,這條SQL語句對應的遊标就将在PGA中建立一個運作時區域,注意,這個區域是私有的,隻針對調用SQL的這個使用者程序。PGA就是所有伺服器程序的邏輯集合。
是以PGA和SGA有着質的不同。SGA用于在程序間共享資訊,PGA則用于資訊私有化。圖15-17表示了SGA和PGA記憶體區域内容的不同。
SGA:資料緩存、共享池、大池、Java池...
PGA:堆棧空間、使用者會話資料、遊标狀态...
PGA的大小直接影響了性能,尤其針對會導緻排序的SQL查詢。以下幾種情況需要提供足夠的PGA:
導緻排序的操作如 ORDER BY、GROUP BY、 ROLLUP等操作
哈希連接配接
位圖合并
位圖建立
批量資料裝載
在Oracle 10g/11g版本中,PGA的管理被自動化設定,成為自動的PGA記憶體管理。在該方式中,Oracle将動态調整PGA記憶體的大小為
SGA記憶體的20%,最小值是10MB。初始化參數PGA_AGGREGATE_TARGET顯示了目前PGA的配置設定情況。
SQL> show parameters pga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 90M
SQL>
在建構一個新的資料庫執行個體時,PGA_AGGREGATE_TARGET 參數可以首先憑經驗進行确定,例如,對應SGA大小20%。然後,
在系統載荷上升的情況下,使用Oracle PGA優化工具,調節 PGA_AGGREAGATE_TARGET參數。Oracle 提供了兩個PGA建議
性能視圖:V$PGA_TARGET_ADVICE和V$PGA_TARGET_ADVICE_HISTOGRAM。
例如下面的查詢列出了在不同PGA設定時預計的命中率:
select round(pga_target_for_estimate/1024/1024) est_target_mb,estd_pga_cache_hit_percentage,estd_overalloc_count,pga_target_factor from v$pga_target_advice order by 1;
EST_TARGET_MB ESTD_PGA_CACHE_HIT_PERCENTAGE ESTD_OVERALLOC_COUNT
------------- ----------------------------- --------------------
PGA_TARGET_FACTOR
-----------------
11 97 2
.125
23 97 2
.25
45 100 1
.5
EST_TARGET_MB ESTD_PGA_CACHE_HIT_PERCENTAGE ESTD_OVERALLOC_COUNT
------------- ----------------------------- --------------------
PGA_TARGET_FACTOR
-----------------
68 100 0
.75
90 100 0
1
108 100 0
1.2
EST_TARGET_MB ESTD_PGA_CACHE_HIT_PERCENTAGE ESTD_OVERALLOC_COUNT
------------- ----------------------------- --------------------
PGA_TARGET_FACTOR
-----------------
126 100 0
1.4
144 100 0
1.6
162 100 0
1.8
EST_TARGET_MB ESTD_PGA_CACHE_HIT_PERCENTAGE ESTD_OVERALLOC_COUNT
------------- ----------------------------- --------------------
PGA_TARGET_FACTOR
-----------------
180 100 0
2
270 100 0
3
360 100 0
4
EST_TARGET_MB ESTD_PGA_CACHE_HIT_PERCENTAGE ESTD_OVERALLOC_COUNT
------------- ----------------------------- --------------------
PGA_TARGET_FACTOR
-----------------
540 100 0
6
720 100 0
8
14 rows selected.
SQL>
||||||||||||||||||||||||||||||||||||||
摘自-老白一個金牌DBA的故事
Process Global Area,也就是常說的Program Global Area,簡稱PGA,是資料庫服務程序的私有空間。它包含全局變量資料結構和控制資訊,比如一個遊标的執行空間。當某個遊标執行時,都需要在執行該遊标的服務程序的PGA裡配置設定一個運作空間。
調整PGA能夠提高資料庫的性能。總的來說,PGA空間越大,能夠得到越快的性能。拿排序來說,如果有足夠的PGA排序區(sort area),那麼所有的排序操作都可以在記憶體中完成,這樣的操作時最優化的,稱為Optimal Execs。
如果排序空間不足,那麼就需要使用臨時表空間将資料存儲到臨時段中。如果通過一次磁盤操作完成排序工作,稱為1-pass Execs。這種方式由于要進行磁盤操作,效率大大降低。如果通過一次磁盤操作還不能完成,需要進行多次磁盤互動,那麼排序效率就十分低下了,這種情況稱為m-pass Execs。
Oracle 8i隻能通過調整*_area_size 參數來調整PGA的性能。Oracle 9i有了革命性的改進,DBA可以通過設定PGA_ARREGATE_TARGET參數來限制PGA的大小,而由Oracle内部的智能算法來自動進行PGA各種工作緩沖區的配置設定工作。當WORKAREA_SIZE_POLICY設定為AUTO時,PGA自動管理就會起作用。(這兩個參數都可以動态修改)
要注意的是,在Oracle 9i R2版本中,PGA_AGGREGATE_TARGET隻能控制獨立伺服器模式的服務程序的工作區域。共享伺服器模式的連接配接還是由*_area_size來控制。Oracle 10g可以控制獨立伺服器和共享伺服器模式的所有工作區域。
與oracle 8i比較,Oracle 9i的工作區管理更加靈活。Oracle 9i提供動态工作區管理的能力。在Oracle 8i下,配置設定的工作區域将不會歸還給作業系統,會導緻Oracle對實體記憶體的過度占用,嚴重時會導緻系統産生換頁操作。Oracle 9i的工作區用完後會自動歸還,這樣減輕了資料庫服務程式對實體記憶體的占用。
一般情況下,如果使用裸裝置,那麼對于OLTP系統,PGA_AGGREGATE_TARGET 用以下公式來配置設定:
PGA_AGGREGATE_TARGET=(<Total Physical Memory > * 80%)*20%
對于OLAP系統,可以按照下面的公式計算:
PGA_AGGREAGATE_TARGET=(<Total Physical Memory > *80%) * 50%
要注意的是,以上隻是一個建議的參數設定。如果要知道系統中設定什麼樣的比較合理,建議通過STATSPATCK報告來進行分析。具體的分析方法請參照本章的相關章節。
通過部分系統視圖可以對PGA的使用情況進行分析,得到相應的優化建議。
通過v$pgastat視圖可以得到PGA的詳細情況:
SELECT * FROM V$PGASTAT;
NAME VALUE
--------------------------------------------------------
aggregate PGA target parameter 524288000 bytes
aggregate PGA auto target 463435776 bytes
global memory bound 25600 bytes
total PGA inuse 9353216 bytes
total PGA allocated 73516032 bytes
maximum PGA allocated 698371072 bytes
total PGA used for auto workareas 0 bytes
maximum PGA used for auto workareas 560744448 bytes
total PGA used for manual workareas 0 bytes
maximum PGA used for manual workareas 0 bytes
over allocation count 0 bytes
total bytes processed 4.0072E+10 bytes
total extra bytes read/written 3.1517E+10 bytes
cache hit percentage 55.97 percent
主要名額的含義如下:
aggregate PGA auto target:Oracle可以用于PGA工作區的空間,一般比參數略小
total PGA used for auto workarea:系統實際使用的PGA空間。
maximum PGA used for auto workareas:上次資料庫啟動後PGA空間達到的最大值
total PGA in used:目前正在使用的PGA,可以從v$process的pga_used_mem字段中擷取
over allocation count:當PGA_AGGREGATE_TARGET值過低的時候,擴充的PGA空間。當這個值不是0的時候,大多數情況下應該增大該參數
以下名額在Oracle 9i Release 2以後的版本具有的名額:
over allocation count:如果PGA_AGGRAGATE_TARGET太小,動态擴充PGA空間的次數,如果系統的實體記憶體足夠,那麼應該設定一個足夠大
小的PGA_AGGRAGATE_TARGET,使該統計值為0
cache hit percentage:PGA工作區使用記憶體的百分比,如果記憶體足夠,那麼這個值應該接近或者等于100%
SELECT LOW_OPTIMAL_SIZE/1024 low_kb,(HIGH_OPTIMAL_SIZE+1)/1024 high_kb,
optimal_executions, onepass_executions, multipasses_executions
FROM v$sql_workarea_histogram
WHERE total_executions != 0;
LOW_KB HIGH_KB OPTIMAL_EXECUTIONS ONEPASS_EXECUTIONS MULTIPASSES_EXECUTIONS
------ ------- ------------------ ------------------ ----------------------
8 16 156255 0 0
16 32 150 0 0
32 64 89 0 0
64 128 13 0 0
128 256 60 0 0
256 512 8 0 0
512 1024 657 0 0
1024 2048 551 16 0
2048 4096 538 26 0
4096 8192 243 28 0
8192 16384 137 35 0
16384 32768 45 107 0
32768 65536 0 153 0
65536 131072 0 73 0
131072 262144 0 44 0
262144 524288 0 22 0
這個視圖可以顯示各種工作區的使用情況,OPTIMAL_EXECUTIONS是不需要通過臨時表空間交換的操作的次數。ONEPASS_EXECUTIONS是需要進行一次臨時表空間交換的操作次數。MULTIPASSES_EXECUTIONS是需要多次臨時表空間交換的操作次數。原則上,如果100%的操作都是記憶體操作,是最佳的選擇。如果記憶體不足,某些大型操作是ONEPASS的,也是可以接受的。出現MULTIPASSES的操作會引起性能的急劇下降。
V$SQL_WORKAREA_ACTIVE
這個視圖顯示目前工作區的活動情況。小于64K的小型排序不會被統計。通過該視圖可以監控目前系統的工作區使用情況。比如:
SELECT to_number(decode(SID, 65535, NULL, SID)) sid,
operation_type OPERATION,trunc(EXPECTED_SIZE/1024) ESIZE,
trunc(ACTUAL_MEM_USED/1024) MEM, trunc(MAX_MEM_USED/1024) "MAX MEM",
NUMBER_PASSES PASS, trunc(TEMPSEG_SIZE/1024) TSIZE
FROM V$SQL_WORKAREA_ACTIVE
ORDER BY 1,2;
SID OPERATION ESIZE MEM MAX MEM PASS TSIZE
--- ----------------- --------- --------- --------- ----- -------
8 GROUP BY (SORT) 315 280 904 0
8 HASH-JOIN 2995 2377 2430 1 20000
9 GROUP BY (SORT) 34300 22688 22688 0
11 HASH-JOIN 18044 54482 54482 0
12 HASH-JOIN 18044 11406 21406 1 120000
以下是這些資料的含義:
SID:産生排序操作的SESSION ID
Operation:操作的類型
Esize:PGA管理器估計的本次操作需要的總記憶體數量(機關是KB)
MEM:目前正在使用的記憶體數量(機關是KB)
MAX MEM:該SESSION曾經使用的最大PGA記憶體數量(機關是KB)
PASS:0代表記憶體排序,1代表1-pass排序,M代表M-PASS排序
TSIZE:轉儲到臨時表空間的大小(機關是KB)
對于ORACLE 9I RELEASE 2版本以後的資料庫,提供了2個新的視圖:
V$PGA_TARGET_ADVICE:提供PGA使用的建議資料
V$PGA_TARGET_ADVICE_HISTOGRAM:PGA建議直方圖
對于一個正在運作的實際系統,通過這2個視圖,可以了解如何配置PGA_AGGREGATE_TARGET是比較合适的。要使用這2個視圖,
首先要設定statistics_level為TYPICAL或者ALL,如果該參數設定為BASIC,那麼這兩個視圖不會提供任何資料。
V$PGA_TARGET_ADVICE視圖提供PGA_AGGREGATE_TARGATE和PGA命中率以及PGA OVERALLOC的數量。比如:
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;
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
在設定PGA_AGGREGATE_TARGET的時候,盡量選擇實體記憶體可以支撐的,命中率比較高,并且ESTD_OVERALLOC_COUNT為0的建議值。在上面的例子裡,PGA_AGGREGATE_TARGET取值的最小值是375,低于這個值,OVERALLOC是非零的。如果實體記憶體充足,設定為4000M或者更高可以提高PGA的性能。
V$PGA_TARGET_ADVICE_HISTOGRAM視圖提供PGA使用情況的直方圖情況。通過這個統計直方圖,可以了解系統中每個大小規模的區域的使用情況,如果某類較小的工作區域産生了M-PASS的操作,那麼說明PGA的設定偏小。
注1:PGA_AGGREGATE_TARGET參數在OpenVms作業系統下無效。
注2:由于BUG問題,在HP-UX 11.0下,如果使用oracle 9.0.1版本,設定PGA_AGGREGATE_TARGET會導緻作業系統當機。