天天看點

重學PGA

 程式全局區(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會導緻作業系統當機。