淺說Oracle PGA空間管理
Oracle例項是Oracle Server的重要組成部分,理論上包括一塊共享記憶體(Shared Memory)和一系列後臺程式(Background Process)。遠端Remote客戶端透過在伺服器端的代理Server Process與Oracle 例項進行通訊互動。在每一個Server Process上,都對應一塊私有的記憶體空間,我們稱之為Private Global Area(簡稱為PGA)空間。本篇中,我們就簡單介紹一下PGA的組成和管理細節。
1、PGA組成和功能
PGA是Server Process對應的私有空間,其中儲存的都是與會話相關的資料和相關資訊。PGA中,主要包括全域性變數、資料結構和控制資訊。比如我們常說的Session Cursor,就是在執行一個SQL的時候生成在PGA空間中,與SGA中Shared Cursor對應的SQL執行體。
在空間使用上,session cursor使用的PGA比較少。很多時候,Oracle的效能好壞是與PGA大小配置密切相關。在執行一些長時間執行、操作結果集合很大的SQL時,Oracle是會將處理的資料集和中間結果集合轉移到Server Process的私有空間——PGA中進行處理。在筆者過去的一些文章中,也介紹過Hash、Group by和Sort等操作對PGA的空間使用情況。在Oracle中,對PGA中這樣的空間稱之為Work Area。
Work Area的大小設定是和Oracle效能密切相關。在Work Area的具體組成上,有幾個比較需要關注的部分:hash_area、sort_area和bitmap_area。
SQL> show parameter hash_area
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
hash_area_size integer 131072
SQL> show parameter sort_area
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sort_area_retained_size integer 0
sort_area_size integer 65536
SQL> show parameter bitmap
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
bitmap_merge_area_size integer 1048576
create_bitmap_area_size integer 8388608
其中,hash_area是Oracle對SQL進行連線操作(主要是hash join)時,將進行hash函式計算過的bucket集合進行儲存的位置。而sort_area表示SQL中進行order by等聚集操作的結果集合場所。
通常情況下,我們都希望SQL執行所需要的中間結果在Work Area的特定區域中可以容納。因為PGA對應的是記憶體區域,進行資料處理和儲存的速度要遠快於磁碟處理速度。當SQL執行所需要的空間小於work area時候,SQL執行的速度就會很快。但是如果SQL需要空間大於Work Area時,Oracle就會使用Temp表空間的空間進行“置換”操作。這個過程要涉及到比較複雜的計算和儲存過程,所以一旦出現這樣的“multi-pass”過程,SQL執行的效率通常是較低,響應時間也隨之增加。
2、PGA空間管理
由於PGA各個組成部分,特別是work_area對SQL執行效率的影響,所以各部分的tunning是早期Oracle DBA一個比較頭疼的問題。
在Oracle 8i以及以前,DBA需要對系統的PGA進行仔細的調節,評估整個應用系統最佳使用情況。調節的方法主要是對Oracle初始化引數的調節,主要有sore_area_size、hash_area_size、bitmap_merge_area_size和create_bitmap_area_size等。
進入Oracle 9i後,一場持續Oracle多個版本的革命開始,Oracle開始提供一種自動調節PGA的功能。DBA只需要指定一個初始化引數pga_aggregate_target,作為從資料庫伺服器角度希望分配給所有Server Process的PGA總和大小。
SQL> show parameter pga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 194M
一旦設定了pga_aggregate_target引數,就意味著規定Oracle例項在分配給所有Server process PGA空間的時候,總分配量不要超過這個引數值。但是注意,這個引數是一個target,有一些情況下,Oracle分配的Server process PGA總和是會超過這個target值的。但是總的來說,Oracle在調整時會盡量圍繞這個規劃值進行調整。
此外,要開啟自動的SQL執行空間管理,還要設定workarea_size_policy初始化引數。
SQL> show parameter workarea
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
workarea_size_policy string AUTO
當該引數被設定為auto之後,和pga_aggregate_target結合使用就起到了自動調節PGA的作用。與該auto取值對應的workarea_size_policy取值為manual,也就是過去一直使用的手工調整方法。
針對不同的資料庫例項情況,主要是應用負載和應用併發Server Process,可以說每個例項調整值都是不同的,都存在各自獨特的最優值。從9iR2開始,Oracle同時推出了Advisor元件功能,對一些如buffer_cache、PGA等提出了最最佳化建議,最為DBA進行實際設定時候的重要參考。
3、歷代Oracle的PGA設定變化
從Oracle 9i開始,PGA自動配置調整就成為Oracle PGA設定的一種主要方式。DBA不再過多關注PGA內部各個區劃分的大小問題,而是隻需要站在Database Server角度,看分配給所有PGA的記憶體空間大小就可以了。各個分割槽大小都是透過Oracle自適應的過程進行調節。
注意,在9iR2中,自動進行PGA空間調節的功能只針對獨佔連線模式(Dedicated Server Connections),對於共享連線模式(Shared Connections)來說不其效果。
到了10g,上面的限制被打破,自動PGA管理調節支援所有種類的連線模式。11g之後,經歷兩個版本成熟過程的Oracle將自動儲存管理(Automatic Memory Management AMM)擴充覆蓋了SGA和PGA。也就是說,DBA只要設定一個Memory_Target引數,指定Oracle Database Server一共需要使用多少的記憶體資源,剩下的分配和調節都是交給Oracle去進行。
不過,在11g環境下,官方推介還是對引數pga_aggregate_target設定一個較小的取值,用來保證最小的PGA總分配量。在使用Memory_Target的情況下,Oracle會依據負載和併發Server的情況將空間在PGA和SGA進行分配,很多情況下有可能出現SGA延展過大的情況,所以設定一個較小的pge取值,可以保證系統正常執行。
4、結論
Oracle PGA是例項的一個重要部分,也是我們進行調優和內部結構研究的重要組成。從Oracle 9i開始推行的AMM,很大程度上減輕了DBA的監控和調整壓力,使Oracle資料庫開始進入自適應調優時代。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-708788/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle OCP(49):表空間管理Oracle
- 【TABLESPACE】Oracle 表空間結構說明Oracle
- Oracle:PGA 簡介Oracle
- Oracle表空間Oracle
- oracle 表空間Oracle
- Oracle表空間的管理方式(LMT、DMT)--本地和字典管理Oracle
- 增加oracle表空間Oracle
- oracle temp 表空間Oracle
- 8. Oracle日常管理——8.2.DB日常管理——8.2.2. DB空間Oracle
- 淺說:網路空間擬態防禦是個什麼鬼?
- Oracle 擴充磁碟空間Oracle
- oracle表空間的整理Oracle
- Oracle 批量建表空間Oracle
- Oracle清理SYSAUX表空間OracleUX
- oracle 檢視錶空間Oracle
- 深入淺出之切空間
- Oracle10g的回收站(recyclebin)和自由空間管理Oracle
- 8. Oracle日常管理——8.1. OS日常管理——8.1.2. OS儲存空間Oracle
- Oracle Temp 表空間切換Oracle
- oracle 表移動表空間Oracle
- Oracle表移動表空間Oracle
- Oracle 表空間增加檔案Oracle
- 清理oracle資料庫空間Oracle資料庫
- Oracle表空間收縮方案Oracle
- Oracle RMAN 表空間恢復Oracle
- 【TUNE_ORACLE】PGA_AGGREGATE_LIMIT詳解(一)PGA_AGGREGATE_TARGET的限制OracleMIT
- 【TUNE_ORACLE】PGA_AGGREGATE_LIMIT詳解(二)PGA_AGGREGATE_LIMIT的作用OracleMIT
- Go的棧空間管理Go
- Oracle的表空間quota詳解Oracle
- 關於oracle的空間查詢Oracle
- oracle臨時表空間相關Oracle
- ORACLE ASM磁碟組空間溢位OracleASM
- oracle sql 表空間利用率OracleSQL
- Oracle OCP(47):表空間的建立Oracle
- 【Oracle 恢復表空間】 實驗Oracle
- 【TABLESPACE】Oracle表空間最佳實踐Oracle
- 【TUNE_ORACLE】PGA_AGGREGATE_LIMIT詳解(三)PGA_AGGREGATE_LIMIT的大小設定OracleMIT
- oracle建立臨時表空間和資料表空間以及刪除Oracle
- 【TUNE_ORACLE】檢視Oracle的壞塊在空閒空間中還是在已用空間中的SQL參考OracleSQL