PGA管理和調整

2022-08-02 06:03:11 字數 4192 閱讀 9835

在oracle 9i以後

支援兩種pga 管理支援兩種管理模式, 一重就是手動管理模式, 另一種就是自動管理模式。

1.pga 手動管理模式

所謂手動管理模式就是手動設定pga裡的各個模組(sort_area_size/ hash_area_size/bitmap_merge_are_size 等)的大小值, 這些值不會根據負荷彈性變化, 而且一旦手動設定為手動模式。 則應用到伺服器中每1個server process, 也就是說每個server process所佔的pga將會是一樣的。

1.1 設定方法

alter system set workarea_size_policy=manual scope=both;

alter system set sort_area_size=2m scope=both;

alter system set hash_area_size=2m scope=both;

alter system set bitmap_merge_area_size scope=both;

上面的語句就將pga設為手動管理模式, 而且sort_area設成2m, hash_area設成2m. bitmap_area設成1m。

1.2 pga手動管理模式的缺點

上面提到, 一旦將pga管理模式設為手動,那麼裡面的引數是不會變化的, 如上面的例子,sort_area是2m, 這是這個session突然收到1個很負責的排序sql語句。 所需的排序空間為4m。

這種情況下pga裡面的2m sort area 就不夠用了, 這時會server process會向臨時表空間申請一塊2m的空間,與原來的pga2m空間一起使用, 就夠2m了。  但是我們知道pga空間實際上就是記憶體空間, 而臨時表空間對應1個或多個dbf,是1個物理磁碟空間。

我們可以用如下語句來檢視臨時表空間的資料檔案:

既然臨時表空間實際上是磁碟空間, 那麼server process往裡面寫入資料用於排序。 就肯定執行了1次物理寫動作了。其實pga排序也可以分成3種:

1) 完全記憶體排序, 也就是說pga裡的sort_area 足夠用

2) 一次寫磁碟排序,  sort_area 不夠用。 需要申請臨時表空間並執行一次寫動作

3) 多次寫磁碟排序,  排序動作很負責。 需要多次向臨時表空間執行寫入動作。

而磁碟寫動作是很慢的, 所以一旦執行第2 和第3種情況, 那麼對應session執行的sql語句就變得很慢了。

hash_area 同理

為了避免這個情況, 假如我們手動將pga 的 sort_area_size 設成10m..

雖然可以避免一部分的磁碟排序或磁碟hash連線, 但是一些負荷很小的server process也同樣會得到10m的sort_area 空間,造成了記憶體使用浪費。

所以9i 以後,絕大部分情況下,強烈建議使用pga自動管理模式。

2.pga 自動管理模式

自動管理模式設定方便得多, 無需為pga裡的sort_area/ hash_area/ bitmap_merge_area 等部分設定具體大小。而是在記憶體裡劃出了1個空間作為1個總的公共sga。

但是這個公共sga也不是完全地由所有server process共享的, 一旦乙個server process需要使用sga,則會在公共sga裡劃出一塊空間單獨使用, 但使用完成後, 會自動把空間釋放回公共sga裡, 這樣, 負荷小的server process就不占用多餘的sga空間, 顯得很彈性化, 比較合理了。

但當1個負荷很重的process 需要大量的sga空間時。 公共sga也不會把全部的空間都劃給這個sga的,因為一旦全部劃給它。 則其他的 server process有可能同時都產生磁碟排序或磁碟雜湊連線了。  而是只給1個上限值給這個高負荷的server process,讓它單獨乙個磁碟排序..  不影響其他server process

2.1 設定方法

alter system set workarea_size_policy=auto scope=both;      //預設就是auto

alter system set pga_aggregate_target=512m scope=both; //將公共sga大小上限設為512m

2.2 應該設為多大才合適

在oltp系統中, 典型pga記憶體設定應該是記憶體的較小部分(例如15%), 剩下的80%交給sga

在dss系統(資料倉儲)中, 因為會執行依稀很大的查詢, pga記憶體可以設大一點。 例如50%

2.3 pga_aggregate_target 其實並不是1個硬性指標, 而只是1個臨界值。

怎麼說呢, 舉個例子:

例如1個資料庫中pga_aggregate_target 設成60mb, 這時有3個server process, 第乙個需要10mb, 那麼pga會按需給它10m, 第二個需要20mb, pga給它20m. 第3個需要30m, 那麼pga把剩下的30m給它..

這是pga所有的記憶體都被占用了。這時來了第4條session, 伺服器建立1個新的server process 需要10m pga空間,但是公共pga空間已經全部占用了,這時公共pga會向記憶體再申請10m空間, 也就是說公共pga到達pga_aggreate_target後也會自動擴容的, 區別就是這是公共pga空間不會按需分配給第4條server process 10m 空間, 只會給1部分, 例如5mb.. 以後的第6條,第7條server process同樣道理,

智慧型得到一部分所需要的pga 空間, 除非sga裡的被占用空間被釋放回來。

也就是說pga空間占用到達pga_aggeratee_target時, 則肯定會發生磁碟排序或磁碟雜湊連線, 但是並不是完全的磁碟內操作, 但是pga其實也會自動擴容, 而且會給每1個新的server process所需的一部分pga記憶體空間。以避免它執行完全的磁碟排序或磁碟雜湊連線。

2.4 每個session最大能分配多少sga空間

上面都提過了,實際上1個server process不能獨佔公共pga中的所有空間, oracle中存在1個_pga_max_size, 指定1個session 最多能獲得多少pga空間。

我們可以用下面語句來查詢這個值

執行結果:

如上圖, 這個值是200m, 也就是說任意1個process pga上限是200m啦

2.5 檢視當前session占用pga情況

其實我們也可以根據資料庫大概的session數量來決定公共pga的大小.

可以用如下語句來察看當前各session 的pga使用情況:

執行結果:

只有3個session啦.其中pga_max_mem意思是這個session占用過pga的最大值.

2.6 利用$pga_advice_target 來決定公共pga大小

執行如下如句:

結果:

其中cache_hit_prec 就是記憶體命中率,  edtd_overalloc_count就是硬碟io次數, 上圖中設為108mb就足夠了.

2.7 資料庫當前記憶體排序和磁碟排序的次數

執行如下如句:

select * from v$sysstatwhere name like '%sort%';

執行結果:

可以見到磁碟排序次數為0, 當然我用的只是符合很小的學習資料庫啦.

但是在11g中, 使用的是amm(auto memory management)管理模式,pga的管理更加方便了, pga_aggregate_target 預設是0, 也就是說支援自動管理,會動態地增加和減少,但是大小不會超過memory_max_target 這個值.

PGA 記憶體自動管理

pga 記憶體自動管理 sql 工作區可以是自動的 全域性的管理。dba 只要設定引數 pga aggregate target 給乙個例項的 pga 記憶體指定總的大小。設定這個引數後,oracle 將它作為乙個總的全域性限制值,盡量使所有 oracle 服務程序的 pga 記憶體總數不超過這個值...

理解PGA(1)PGA記憶體作用和構成

當客戶端向伺服器傳送連線請求,伺服器監聽到客戶端的請求,在專用伺服器模式下,會在伺服器端衍生乙個server process來 客戶的請求,server process進而向例項發起連線,建立會話,而pga就為server process所分配和使用。pga,這p,或譯之程式,或翻為私有,角度不同而...

理解PGA(1)PGA記憶體作用和構成

當客戶端向伺服器傳送連線請求,伺服器監聽到客戶端的請求,在專用伺服器模式下,會在伺服器端衍生乙個server process來 客戶的請求,server process進而向例項發起連線,建立會話,而pga就為server process所分配和使用。pga,這p,或譯之程式,或翻為私有,角度不同而...