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