Oracle認證:Oracle內存結構研究-PGA篇

  一、概述

Oracle認證:Oracle內存結構研究-PGA篇

SGA,PGA,UGA都是Oracle管理的內存區。

SGA(System Global Area),即系統全局區,Oracle中最重要的內存區。

PGA(Process Global Area),即程序全局區,一個進程的專用的內存區。

UGA(User Global Area),即用戶全局區,與特定的會話相關聯。

專用服務器連接模式,UGA在PGA中分配

共享服務器連接模式,UGA在SGA中的Large Pool中分配。

如果採用專用服務器連接模式,PGA中包含UGA,其他區域用來排序,散列和位圖合併。

簡單來講,PGA=UGA+排序區+散列區+位圖合併區。

  二、PGA的管理模式

PGA分兩種管理模式:

1) 手動PGA內存管理,用戶指定排序區和散列區所使用的內存,每個連接使用相同的內存。

2) 自動PGA內存管理,告訴Oracle可以使用的PGA的總量,由Oraclce根據系統負載決定具體分配。

9iR1時默認爲手動PGA內存管理,9iR2以後默認爲自動PGA內存管理。

PGA內存可以動態擴大和回收。

PGA內存管理模式由WORKAREA_SIZE_POLICY控制。

1) 設爲MANUAL,啓用手動內存管理。

2) 設爲AUTO,並且PGA_AGGREGATE_TARGET不爲0時,啓用自動內存管理。

  三、手動PGA內存管理

有三個參數對PGA影響最大。

SORT_AREA_SIZE:對信息排序所用的內存總量

SORT_AREA_RETAINED_SIZE:排序後在內存中保存排序信息的內存總量。

HASH_AREA_SIZE:存儲散列列表所用的內存量。

下面對這三個參數進行說明:

1) SORT_AREA_SIZE:

如果SORT_AREA_SIZE設爲512KB,SORT_AREA_RETAINED_SIZE也爲512KB,則Oracle使用512KB的內存進行排序,排序後所有數據都留在內存中。

2) SORT_AREA_RETAINED_SIZE:

如果SORT_AREA_SIZE設爲512KB,SORT_AREA_RETAINED_SIZE設爲384KB,則Oracle使用512KB的內存進行排序,然後保留384KB的已排序數據,另外512KB-384KB=128KB的已排序數據會寫到臨時表空間中。

如果SORT_AREA_RETAINED_SIZE沒有設置,則它的值爲0,但是實際保留的排序數據和SORT_AREA_SIZE相同。

3) HASH_AREA_SIZE:

一個大集合和另個集合進行連接時,會用到HASH_AREA_SIZE參數。較小的` 表會放到這部分內存中作爲驅動表,然後大表進行探索(PROBE)操作進行連接。如果HASH_AREA_SIZE過小會影響兩個集合(表)連接時的性能。

注意點:

1) 如果需要排序的數據量大於SORT_AREA_SIZE,Oracle會分批進行排序。把當前已排序的數據保存到臨時表空間中,然後對剩餘的數據進行排序。最後,還會對這些保存在臨時表空間中的已排序數據再進行排序,因爲每次保存到臨時表空間中的已排序數據只是部分數據的排序,對整體需排序的數據來說只是部分局部有序。

2) *_AREA_SIZE只是對某個操作的限制,一個查詢可能有多個操作,每個操作都有自己的內存區。如果SORT_AREA_SIZE設爲5MB,一個查詢可能會有10個排序操作,這樣一個查詢會佔用50MB的排序內存。

3) 3,*_AREA_SIZE內存的分配是按需分配。如果一個查詢需要5MB內存進行排序,就算分配1G的SORT_AREA_SIZE也不會全部使用,只會使用需要的5MB的內存量。

  四、自動PGA內存管理

要啓用自動PGA內存管理,設置下列參數:

1,WORKAREA_SIZE_POLICY=AUTO

2,PGA_AGGREGATE_TARGET=非零

有關PGA_AGGREGATE_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內存,無論有多少並行進程。

  五、手動PGA內存管理與自動PGA內存管理

自動PGA內存管理相對於手動PGA內存管理有很多優點

1, 當用戶連接少時

a) 手動PGA內存管理不管有多少可用內存都按照預設值進行分配。比如當前空閒內存爲300MB,連接需要10MB的內存進行排序,而我們設定的排序區大小爲5MB,導致雖然有足夠的空閒內存卻無法分配給當前連接,造成執行效率低下。

b) 自動PGA內存管理會根據當前空閒內存來進行分配。當空閒內存爲300MB,當前用戶需要10MB內存進行排序,Oracle就會分配10MB內存給當前用戶。

2, 當用戶連接多時

a) 手動PGA內存管理會完全按照預設值分配內存。如果物理內存總量爲1G,排序區設爲5MB,當有300個用戶連接時,Oracle會分配1.5G的內存,這已經超過了我們的實際物理內存!

b) 自動PGA內存管理會根據當前連接情況進行分配。如果物理內存總量爲1G,PGA_AGGREGATE_TARGET爲300MB,當用戶數從10升到 300時,每個用戶連接的內存會從滿足需要的10MB慢慢減少到1.3MB,雖然最後總量也會超過PGA_AGGREGATE_TARGET,但比起手動 PGA內存管理要好很多了。

什麼時候使用自動PGA內存管理?什麼時候使用手動PGA內存管理?

白天系統正常運行時適合使用自動PGA內存管理,讓Oracle根據當前負載自動管理、分配PGA內存。

夜裏用戶數少、進行維護的時候可以設定當前會話使用手動PGA內存管理,讓當前的維護操作獲得儘可能多的內存,加快執行速度。

如:服務器平時運行在自動PGA內存管理模式下,夜裏有個任務要大表進行排序連接後更新,就可以在該操作session中臨時更改爲手動PGA內存管理,然後分配大的SORT_AREA_SIZE和HASH_AREA_SIZE(50%甚至80%內存,要確保無其他用戶使用),這樣能大大加快系統運行速度,又不影響白天高峯期對系統造成的影響。