Oracle體系結構之記憶體結構(SGA、PGA)
跟其它的全域性區不同,Call Global Area是短暫性存在的.它只有在函式呼叫期間存在,一般是在對例項的最低級別的呼叫時才需要CGA,比如:分析一個SQL語句,執行一個SQL語句,取出一個SELECT語句的輸出
一個單獨的CGA在遞迴呼叫時是需要的.在SQL語句的分析過程中,對資料字典資訊的遞迴呼叫是需要的,因為要對SQL語句進行語法分析,還有在語句的優化期間要計算執行計劃.執行PL/SQL塊時在處理SQL語句的執行時也是需要遞迴呼叫的,在DML語句的執行時要處理觸發器執行也是需要遞迴呼叫的.
不管UGA是放在PGA中還是在SGA中,CGA都是PGA的一個子堆(Subheap).這個事實的一個重要推論是在一個呼叫的期間會話必須是一個程序.對於在一個MTS的Oracle資料庫程序應用開發時關於這一點的理解是很重要的.如果相應的呼叫較多,就得增加processes的數量以適應呼叫的增加.
沒有CGA中的資料結構,CALLS是沒法工作的. 而實際上跟一次CALL相關的資料結構一般都是放在UGA中,如SQL AREA,PL/SQL AREA, SORT AREA, hash area, bitmap area它們都必須在UGA中, 因為它們要在各CALLS之間要一直存在並且可用. 而CGA中所包含的資料結構是要在一次CALL結束後能夠釋放的. 例如CGA包含了關於遞迴呼叫的資訊,直接I/O BUFFER等還有其它的一些臨時性的資料結構.
5. 總結一下
PGA包括:
1)Fixed PGA
2)UGA (dedicated server),當系統是shared server時,UGA位於shared pool或者large pool。
3)CGA
而UGA和CGA都屬於Variable PGA(PGA heap)
UGA包括:
1)Fixed UGA
2)private SQL area
3)session memory
4)SQL Work Areas
private SQL area, session memory, SQL work ares都屬於variable UGA(UGA heap).
6. private SQL area
可以分為兩部分:
1)永久記憶體區域:存放相同SQL語句多次執行時都需要的一些遊標資訊,比如繫結變數等。這部分記憶體只有在遊標被關閉時才釋放。所以稱為:永久記憶體區域。
2)執行時區域:處理SQL語句時的第一步要建立執行時區域,這裡存放了當SQL執行時所使用的資訊。對於DML語句,SQL執行完畢就釋放該區域;對於select語句,當所有資料行返回給使用者時釋放。
7. session area
儲存該session的一些引數,比如:修改的NLS引數,修改的優化器引數optimizer_mode,alter session命令所啟用的跟蹤資訊,可以使用的roles,所開啟的db links,真正使用的package等。
8. SQL work area
SQL工作區是UGA中最重要的部分,佔UGA的大部分記憶體。主要是在排序sort(ordr by, group by),hash-join時使用。SQL工作區的大小對效能的影響很大。
一般大數量的排序,是不太可能完全在SQL work area中完成的,因為沒有那麼大的記憶體,所以一般都會使用臨時表空間,將排序的中間結果寫入到temp表空間中(磁碟排序)。根據SQL work area的大小,使用臨時表空間的次數可以是一次,也可能是多次。所以有三種情況:
1)optimal: 排序完全在記憶體中完成;
2)onepass: 排序完成,需要使用磁碟一次;
3)multipass: 排序的完成,需要使用磁碟多次;
optimal一般是不太現實的,我們一般儘量保證onepass,如果導致了multipass,則效能會下降很多。我們先來看看排序的過程:
排序演算法採用的是堆排序;排序方式是分批排序,比如10000條記錄排序,把它分成100次,每次對100條記錄排序;當100條排序完成之後,寫入到temp表空間;再對下100條排序,排序完之後在寫入到temp表空間;最後對temp表空間的100個區域性排序的佇列進行merge操作。從而完成對10000條記錄的排序。這樣是比較理想的情況,因為只對磁碟讀寫一次,屬於onepass。如果排序涉及到磁碟的多次讀寫,則屬於multipass。一般我們儘量調整sort_area_size的大小,來避免multipass排序。
SQL work area可以分為下面幾個部分:
排序區(sort_area_size),hash區(hash_area_size),bitmap區(create_bitmap_area_size,bitmap_merge_area_size)等,他們深刻的影響著排序、hash-join、bitmap等的效能。
9. PGA的自動管理
在Oracle9i之前,我們是通過設定sort_area_size, hash_area_size等引數來管理PGA。
SQL> show parameter 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
workarea_size_policy string AUTO
SQL> show parameter sort_area;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sort_area_retained_size integer 0
sort_area_size integer 65536
SQL> select * from v$pgastat;NAME VALUE UNIT
---------------------------------------- ---------- ------------
aggregate PGA target parameter 71303168 bytes
aggregate PGA auto target 27297792 bytes
global memory bound 14260224 bytes
total PGA inuse 40966144 bytes
total PGA allocated 88008704 bytes
maximum PGA allocated 125034496 bytes
total freeable PGA memory 4259840 bytes
process count 23
max processes count 40
PGA memory freed back to OS 492634112 bytes
total PGA used for auto workareas 0 bytes
maximum PGA used for auto workareas 6105088 bytes
total PGA used for manual workareas 0 bytes
maximum PGA used for manual workareas 0 bytes
over allocation count 0
bytes processed 6275959808 bytes
extra bytes read/written 0 bytes
cache hit percentage 100 percent
recompute count (total) 33814
19 rows selected.
maximum PGA allocated:PGA曾今達到的最大值
使用v$pga_target_advice來估測PGA的大小,即PGA的建議值(類似於v$sga_target_advice和SGA):
V$PGA_TARGET_ADVICE predicts how the cache hit percentage and over allocation count statistics displayed by the V$PGASTAT performance view would be impacted if the value of the PGA_AGGREGATE_TARGET parameter is changed. The prediction is performed for various values of the PGA_AGGREGATE_TARGET parameter, selected around its current value. The advice statistic is generated by simulating the past workload run by the instance.
SQL> select round(pga_target_for_estimate/(1024*1024)) target_size_M, 2 estd_pga_cache_hit_percentage est_cache_hit_percentage, 3 round(estd_extra_bytes_rw/(1024*1024)) est_extra_read_write_M, 4 estd_overalloc_count est_over_alloc from v$pga_target_advice;TARGET_SIZE_M EST_CACHE_HIT_PERCENTAGE EST_EXTRA_READ_WRITE_M EST_OVER_ALLOC------------------ --------------------------- ---------------------- -------------- 17 97 186 31 34 97 186 31 51 100 0 2 68 100 0 0 82 100 0 0 95 100 0 0 109 100 0 0 122 100 0 0 136 100 0 0 204 100 0 0 272 100 0 0 408 100 0 0 544 100 0 013 rows selected.使用v$pga_target_advice_histogram來估測PGA的大小(類似於v$sga_target_advice和SGA):
V$PGA_TARGET_ADVICE_HISTOGRAM predicts how statistics displayed by the V$SQL_WORKAREA_HISTOGRAM dynamic view would be impacted if the value of thePGA_AGGREGATE_TARGET parameter is changed. This prediction is performed for various values of the PGA_AGGREGATE_TARGET parameter, selected around its current value. The advice statistic is generated by simulating the past workload run by the instance.
該檢視可以通過對不同工作區大小的取樣評估提供統計資訊共分析使用SQL在工作區中以3種方式執行:
Optimal(優化方式):指所有處理可以在記憶體中完成;Onepass:大部分操作可以在記憶體中完成,但是需要使用到磁碟排序;Multipass:大量操作需要產生磁碟互動,效能極差。