SGA(System Global Area),即系統全局區,管理數據庫buffer cache,java,stream的內存區html
PGA (Process Global Area),即程序全局區,主要用於管理進程的內存區java
UGA(User Global Area),即用戶全局區,處理用戶會話相關信息的內存區sql
CGA(Call Global Area),即調用全局區,處理如排序、HASH JOIN、位圖合併等工做的內存區數據庫
若是採用專用服務模式(Dedicated Server Connection)那麼UGA在PGA中分配,若是採用共享服務模式(Shared Server Connection),那麼UGA在SGA區的Large pool中分配。bash
UGA組成:session
UGA=User Session+Cursor state+Sort Area Retained數據結構
User Session:用戶會話,存放用戶權限、角色、性能統計等信息。ide
Cursor state(私有SQL區):即一個句柄,或稱爲指針、引用指向Sql私有區。而後私有Sql區又指向共享Sql區。私有Sql區分兩個部分:性能
固定部分:綁定信息,數據結構信息,指針。隨session的建立而建立,結束而釋放。指針
動態部分:執行sql的中間結果集,如多表關聯、排序。隨sql建立而建立,結束而釋放。
專用模式下的PGA組成:
PGA=UGA+CGA
PGA的管理模式:
手動管理模式,用戶指定排序區和散列區所使用的內存,每一個鏈接使用相同的內存。
自動管理模式,設定PGA的總量,由Oracle根據系統負載自行決定分配。
PGA內存管理模式由WORKAREA_SIZE_POLICY控制
設爲MANUAL,啓動手動內存管理。
設爲AUTO,而且PGA_AGGREGATE_TARGET不爲0時,啓動自動內存管理。
手動PGA內存管理受三個參數的影響最大
SORT_AREA_SIZE 排序區,用於排序時存放排序數據的內存區,屬於PGA
SORT_AREA_RETAINTED_SIZE 排序完成後用於保存排序數據的內存,屬於UGA
HASH_AREA_SIZE 儲存散列表的內存
這三個參數設置的狀況以下:
SORT_AREA_SIZE=SORT_AREA_RETAINTED_SIZE
則排序在內存中進行,且排序結果均保存在內存中。
SORT_AREA_SIZE>SORT_AREA_RETAINTED_SIZE
則在SORT_AREA_SIZE規定的大小中排序,並保留SORT_AREA_RETAINTED_SIZE規定大小的排序數據,超出部分排序數據寫到臨時表中,排序完成後,把排序數據存放在SORT_AREA_RETAINTED_SIZE,最終反饋給終端。若是SORT_AREA_RETAINTED_SIZE設置爲0,則與第一種狀況相同。
當一個多個結果集關聯時,會用到HASH_AREA_SIZE,兩個集合中較小的一個會散列到內存中做爲驅動表,散列區放不下的部分都會經過聯結鍵存儲在臨時表空間中。HASH_AREA_SIZE太小會影響集合關聯時的性能。
備註:
1)如須要排序的數據量大於SORT_AREA_SIZE,Oracle進行分批排序,將排序的結果存到臨時表空間中,而後對剩餘部分進行排序。最後還須要對保存在臨時表中的已排序數據進行再排序,由於每次保存到臨時表空間中的已排序數據只是部分數據的排序,對於總體來講只是局部排序。
2)參數的限制僅是對某個操做的限制,一個查詢能夠有多個操做,例如一個查詢有10個排序,若是SORT_AREA_SIZE限制爲5M,則10個排序佔用50M排序內存。
設置PGA自動管理
SQL> alter system set WORKAREA_SIZE_POLICY=auto; SQL> alter system set PGA_AGGREGATE_TARGET=<size>;
查看PGA建議視圖
SELECT trunc(pga_target_for_estimate / 1024 / 1024) pga_target_for_estimate, to_char(pga_target_factor * 100, '999.9') || '%' pga_target_factor, trunc(bytes_processed / 1024 / 1024) bytes_processed, trunc(estd_extra_bytes_rw / 1024 / 1024) estd_extra_bytes_rw, to_char(estd_pga_cache_hit_percentage, '999') || '%' estd_pga_cache_hit_percentage, estd_overalloc_count FROM v$pga_target_advice;