oracle之pga的作用及管理


PGA可以工作在專用服務器和共享服務器模式下,兩種模式下的PGA工作機制有所不同:

專用服務器(Dedicated):一個客戶端連接對應一個服務器進程,適合批處理和大任務應用。

共享服務器(shared):多個客戶端連接對應一個服務器進程,服務器端存在一個調度進程來管理。它適用於高並發事務量小的業務應用。

 

系統全局區(system global Area)是所有用戶進程共享的一塊內存區域,程序全局區(Program Global Area)也可稱作用戶進程全局區,他的內存在進程私有區而不是共享區。雖然PGA是一個全局區,可以把代碼、全局變量和數據結構都存放在其中,但區域內的資源並不像SGA一樣被所有的用戶進程所共享,而是每個oracle服務器進程都只擁有屬於自己的那份PGA資源,一個服務進程只能訪問屬於它自己的那部分PGA資源區,各個服務進程的PGA區的綜合紀委實例的PGA的大小。通常PGA區由私有SQL區和回話區組成。

1、私有SQL區(private area)

私有SQL區用於存儲變量及sql語句運行時的內存結構信息,當每個用戶鏈接到實例時,都會在實例中創建一個會話,這些會話可能會在SGA區中創建一個共享SQL區,但是在PGA中可能會創建多個私有的SQL區,把一個私有的SQL區與對應的共享SQL區合並在一起,就可以獲得一條SQL語句的完整緩存數據。

另外,每個會話的私有SQL區可以再分為靜態區和動態區兩部分。靜態區的信息在回話過程中保持不變,只有當會話結束時,靜態區才會被釋放掉;而動態區的信息在整個會話過程中是不斷變化的,一旦SQL語句指定完畢,及時會話還沒結束,動態區也被釋放掉。

2、會話區(session memory)

為保存會話中的變量以及其他與會話相關的信息,而分配的內存區。保存的信息包括登錄信息及其他與會話相關的信息。在共享模式下,session memory是共享的。

3、SQL工作區(SQL work area)

對於復雜的查詢,PGA的很大一部分將被那些內存需求很大的操作分配給SQL工作區,主要操作包括:

3.1、基於操作符的排序:group by 、order by、rollup和窗口函數,該區域的參數是SORT_AREA_SIZE

3.2、HASH哈希連接,參數是HASH_AREA_SIZE

3.3、位圖合並,參數是BITMAP_MERGE_AREA_SIZE

3.4、位圖創建,參數是CREATE_BITMAP_AREA_SIZE

例如一個排序操作使用sql工作區將一部分數據行在內存中排序;而一個HASH join 操作則使用工作來建立HASH表。如果這兩種操作所處理的數據量比較大,那么就會將輸入的數據分成一些更小的數據片,使一些數據片能夠在內存中處理,而其他的就在臨時表空間的磁盤上稍后處理。盡管工作區太小是,BITMAP操作不會將數據放到磁盤上處理,但是他們的復雜性和工作區大小成反比,工作區越大,這些操作越快。

假設test表有一萬行數據:select * from test ;和select * from test order by id desc;

第一條語句,server process會把BLOCK一個一個調到BUFFER CACHE中,然后從BUFFER中取出一行返回一行給用戶,PGA這時沒有排序

第二條語句,server process把block加載到BUFFER中會返回給pga的work area,在PGA中進行排序,然后才能返回給用戶。如果這時候SORT_AREA_SIZE不夠大,pga會自動分配空間來加載,但是也不是不限量的,如果內存不夠時,這時候就需要把一部分數據寫到臨時表空間,進行磁盤排序,關於這個磁盤排序的方法我也沒搞明白是怎么具體的方式來排序的,如何才能更高效的用內存及磁盤來排序,有待考究。但是要記住利用磁盤來排序時發生了物理IO這種效率就很差了。

 

關於PGA的管理方式:自動管理及手動管理

從9i開始PGA就開始就支持自動管理了

show parameter area  ;

對應的參數workarea_size_policy的value 為auto即為自動管理,oracle默認自動管理,

SQL> show parameter area

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
bitmap_merge_area_size               integer     1048576
create_bitmap_area_size              integer     8388608
hash_area_size                       integer     131072
sort_area_retained_size              integer     0
sort_area_size                       integer     65536
workarea_size_policy                 string      AUTO               ----pga自動管理

查看對應work area的參數。

關於設置PGA的大小,建議先按服務器內的總內存   *80%*20%來運行一段時間,

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;

再結合數據庫統計信息來設置PGA大小。

一般我們安裝數據庫如windows下創建DBCA時,可以進行選擇

 

如上圖所示即為分配內存空間PGA+SGA總大小為物理內存的80%,而pga和sga的大小自動分配,也可根據實際情況手動分配。 

部分參考內容https://blog.csdn.net/xinzhan0/article/details/54290392?spm=1001.2014.3001.5502


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM