PGA是一個進程專用記憶體,決不允許其他進程訪問。通過C語言的運行時調用malloc()分配,可動態擴縮。而且,PGA絕對不會在oracle的SGA中分配,總是由進程在本地分配。
PGA是介於使用者與oracle執行個體之間的關鍵角色。使用者體驗最敏感的貢獻就在於PGA。
使用者所發出的請求,執行時,是在pga中執行。若在pga中命中,則無須軟解析,此時稱為軟軟解析。pga中的遊標指向database_buffer_cache中的資料行。返回時,是一批批,而非一條條。
UGA就是你的工作階段狀態。你的會話總能訪問這部分記憶體。UGA的位置取決你如何串連oracle。如果是專用伺服器串連,UGA在PGA中建立;如果是共用伺服器串連,UGA則在SGA中建立。但在專用伺服器串連中,也不是有串連就分配一個UGA,它依據hash演算法,構造一張hash表,作hash分桶,按需分配。
所以,PGA包含進程記憶體,還可能包含UGA。
手動PGA記憶體管理受以下參數的控制:
SQL> show parameters area_size
NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
bitmap_merge_area_size integer 1048576
create_bitmap_area_size integer 8388608
hash_area_size integer 131072
sort_area_size integer 65536
自動記憶體管理不需要再手工設定上述的參數值。而是,如果:
1)workarea_size_policy設定為auto
2)pga_aggregate_target設定為非0
那麼就會引入自動記憶體管理pga。
對於OLTP,建議使用auto;對於OLAP,建議使用manual。
pga記憶體配置涉及很多方面,其中只有工作區(包含排序區和雜湊區)在資料庫執行個體的控制之下。pga_aggregate_target是個上限目標,而非啟動時預分配的記憶體大小。你設定了這個值,就意味著你希望oracle能自由使用多大的記憶體來完成排序和雜湊。實際分配的空間可能超過這個值。如果我們已經超過了pga_aggregate_target,oracle對此是睜一隻眼閉一隻眼的,只有當os報告稱再也沒有記憶體時我們的請求才會失敗。oracle睜一隻眼是在做什麼呢?他會識別已經使用的記憶體,相應的減少工作區分配的記憶體大小。如果再請求排序時,就會進行磁碟上I/O了。