PGA管理和调整
在Oracle 9i以后
??????? 支持兩種PGA 管理支持兩種管理模式, 一重就是手動管理模式, 另一種就是自動管理模式。
1.PGA 手動管理模式
??????? 所謂手動管理模式就是手動設置PGA里的各個模塊(sort_area_size/ hash_area_size/bitmap_merge_are_size 等)的大小值, 這些值不會根據負荷彈性變化, 而且一旦手動設置為手動模式。 則應用到服務器中每1個server process, 也就是說每個server process所占的PGA將會是一樣的。
????????? 1.1 設置方法
? ? ?alter system set workarea_size_policy=manual scope=both;alter system set sort_area_size=2m scope=both;alter system set hash_area_size=2m scope=both;alter system set bitmap_merge_area_size scope=both;
?????????? 上面的語句就將pga設為手動管理模式, 而且sort_area設成2m, hash_area設成2m. bitmap_area設成1m。
?????????? 1.2 pga手動管理模式的缺點
?????????? 上面提到, 一旦將pga管理模式設為手動,那么里面的參數是不會變化的, 如上面的例子,sort_area是2m, 這是這個session突然收到1個很負責的排序sql語句。 所需的排序空間為4m。
??????????? 這種情況下pga里面的2m sort area 就不夠用了, 這時會server process會向臨時表空間申請一塊2m的空間,與原來的pga2m空間一起使用, 就夠2m了。? 但是我們知道pga空間實際上就是內存空間, 而臨時表空間對應1個或多個dbf,是1個物理磁盤空間。
???????????? 我們可以用如下語句來查看臨時表空間的數據文件:
????????????? 既然臨時表空間實際上是磁盤空間, 那么server process往里面寫入數據用于排序。 就肯定執行了1次物理寫動作了。其實pga排序也可以分成3種:
????????????? 1) 完全內存排序, 也就是說pga里的sort_area 足夠用
????????????? 2) 一次寫磁盤排序,? sort_area 不夠用。 需要申請臨時表空間并執行一次寫動作
????????????? 3) 多次寫磁盤排序,? 排序動作很負責。 需要多次向臨時表空間執行寫入動作。
????????????? 而磁盤寫動作是很慢的, 所以一旦執行第2 和第3種情況, 那么對應session執行的sql語句就變得很慢了。
?
????????????? hash_area 同理
????????????? 為了避免這個情況, 假如我們手動將pga 的 sort_area_size 設成10m..
????????????? 雖然可以避免一部分的磁盤排序或磁盤hash連接, 但是一些負荷很小的server process也同樣會得到10m的sort_area 空間,造成了內存使用浪費。
?????????????? 所以9i 以后,絕大部分情況下,強烈建議使用pga自動管理模式。
2.PGA 自動管理模式
?????????????? 自動管理模式設置方便得多, 無需為pga里的sort_area/ hash_area/ bitmap_merge_area 等部分設置具體大小。而是在內存里劃出了1個空間作為1個總的公共SGA。
?????????????? 但是這個公共SGA也不是完全地由所有server process共享的, 一旦一個server process需要使用SGA,則會在公共SGA里劃出一塊空間單獨使用, 但使用完成后, 會自動把空間釋放回公共SGA里, 這樣, 負荷小的server process就不占用多余的SGA空間, 顯得很彈性化, 比較合理了。
??????????????? 但當1個負荷很重的process 需要大量的SGA空間時。 公共SGA也不會把全部的空間都劃給這個SGA的,因為一旦全部劃給它。 則其他的 server process有可能同時都產生磁盤排序或磁盤哈希連接了。? 而是只給1個上限值給這個高負荷的server process,讓它單獨一個磁盤排序..? 不影響其他server process
???????????????? 2.1 設置方法
???????????????? alter system set workarea_size_policy=auto scope=both; //默認就是autoalter system set pga_aggregate_target=512m scope=both; //將公共SGA大小上限設為512M
????????????????
????????????????? 2.2 應該設為多大才合適
????????????????? 在OLTP系統中, 典型PGA內存設置應該是內存的較小部分(例如15%), 剩下的80%交給SGA
????????????????? 在DSS系統(數據倉庫)中, 因為會運行依稀很大的查詢, PGA內存可以設大一點。 例如50%
?????????????????
????????????????? 2.3 pga_aggregate_target 其實并不是1個硬性指標, 而只是1個臨界值。
????????????????? 怎么說呢, 舉個例子:
?????????????????? 例如1個數據庫中pga_aggregate_target 設成60MB, 這時有3個server process, 第一個需要10MB, 那么PGA會按需給它10M, 第二個需要20MB, PGA給它20M. 第3個需要30M, 那么PGA把剩下的30M給它..
?????????????????? 這是PGA所有的內存都被占用了。這時來了第4條session, 服務器建立1個新的server process 需要10M PGA空間,但是公共PGA空間已經全部占用了,這時公共PGA會向內存再申請10M空間, 也就是說公共PGA到達pga_aggreate_target后也會自動擴容的, 區別就是這是公共PGA空間不會按需分配給第4條server process 10M 空間, 只會給1部分, 例如5MB.. 以后的第6條,第7條server process同樣道理, 智慧得到一部分所需要的PGA 空間, 除非SGA里的被占用空間被釋放回來。
?????????????????? 也就是說PGA空間占用到達pga_aggeratee_target時, 則肯定會發生磁盤排序或磁盤哈希連接, 但是并不是完全的磁盤內操作, 但是PGA其實也會自動擴容, 而且會給每1個新的server process所需的一部分pga內存空間。以避免它執行完全的磁盤排序或磁盤哈希連接。
???????????????? 2.4 每個session最大能分配多少sga空間
????????????????? 上面都提過了,實際上1個server process不能獨占公共PGA中的所有空間, Oracle中存在1個_pga_max_size, 指定1個session 最多能獲得多少pga空間。
?????????????????? 我們可以用下面語句來查詢這個值
??????????????????
?????????????????????? 執行結果:
?
??????????????????? 如上圖, 這個值是200M, 也就是說任意1個process pga上限是200M啦
?????????????
????????????? 2.5 查看當前session占用Pga情況
??????????????????? 其實我們也可以根據數據庫大概的session數量來決定公共PGA的大小.
????????????????????????? 可以用如下語句來察看當前各session 的pga使用情況:
執行結果:
? ? ? ? ? ? ? ? ?? 只有3個session啦. ??其中PGA_MAX_MEM意思是這個session占用過PGA的最大值. ??
? ? ? ? ? ? ? ? ? 2.6 利用$pga_advice_target 來決定公共PGA大小? ?
? ? ? ? ? ? ? ? ? 執行如下如句:
?????????????????????
? ? ? ? ? ? ? ? ? ? ?? 結果:
?????????
????????? 其中Cache_HIT_PREC 就是內存命中率,? EDTD_OVERALLOC_COUNT就是硬盤IO次數, 上圖中設為108MB就足夠了.
?????????????????????
?????????????????????? 2.7 數據庫當前內存排序和磁盤排序的次數
? ? ? ? ? ? ? ? ? ? ?? 執行如下如句:
? ? ? ? ? ? ? ? ? ? ? ? ? ?? select * from V$SYSSTATwhere name like '%sort%';
? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? 執行結果:
???????????????????????
????????????????????????? 可以見到磁盤排序次數為0, 當然我用的只是符合很小的學習數據庫啦.
??????????????????????????
?????? 但是在11g中, 使用的是AMM(Auto Memory Management)管理模式,pga的管理更加方便了, pga_aggregate_target 默認是0, 也就是說支持自動管理,會動態地增加和減少,但是大小不會超過memory_max_target 這個值.
????????????????????
?????????????????????
???????????????????
??????? 支持兩種PGA 管理支持兩種管理模式, 一重就是手動管理模式, 另一種就是自動管理模式。
1.PGA 手動管理模式
??????? 所謂手動管理模式就是手動設置PGA里的各個模塊(sort_area_size/ hash_area_size/bitmap_merge_are_size 等)的大小值, 這些值不會根據負荷彈性變化, 而且一旦手動設置為手動模式。 則應用到服務器中每1個server process, 也就是說每個server process所占的PGA將會是一樣的。
????????? 1.1 設置方法
? ? ?alter system set workarea_size_policy=manual scope=both;alter system set sort_area_size=2m scope=both;alter system set hash_area_size=2m scope=both;alter system set bitmap_merge_area_size scope=both;
?????????? 上面的語句就將pga設為手動管理模式, 而且sort_area設成2m, hash_area設成2m. bitmap_area設成1m。
?????????? 1.2 pga手動管理模式的缺點
?????????? 上面提到, 一旦將pga管理模式設為手動,那么里面的參數是不會變化的, 如上面的例子,sort_area是2m, 這是這個session突然收到1個很負責的排序sql語句。 所需的排序空間為4m。
??????????? 這種情況下pga里面的2m sort area 就不夠用了, 這時會server process會向臨時表空間申請一塊2m的空間,與原來的pga2m空間一起使用, 就夠2m了。? 但是我們知道pga空間實際上就是內存空間, 而臨時表空間對應1個或多個dbf,是1個物理磁盤空間。
???????????? 我們可以用如下語句來查看臨時表空間的數據文件:
????????????? 既然臨時表空間實際上是磁盤空間, 那么server process往里面寫入數據用于排序。 就肯定執行了1次物理寫動作了。其實pga排序也可以分成3種:
????????????? 1) 完全內存排序, 也就是說pga里的sort_area 足夠用
????????????? 2) 一次寫磁盤排序,? sort_area 不夠用。 需要申請臨時表空間并執行一次寫動作
????????????? 3) 多次寫磁盤排序,? 排序動作很負責。 需要多次向臨時表空間執行寫入動作。
????????????? 而磁盤寫動作是很慢的, 所以一旦執行第2 和第3種情況, 那么對應session執行的sql語句就變得很慢了。
?
????????????? hash_area 同理
????????????? 為了避免這個情況, 假如我們手動將pga 的 sort_area_size 設成10m..
????????????? 雖然可以避免一部分的磁盤排序或磁盤hash連接, 但是一些負荷很小的server process也同樣會得到10m的sort_area 空間,造成了內存使用浪費。
?????????????? 所以9i 以后,絕大部分情況下,強烈建議使用pga自動管理模式。
2.PGA 自動管理模式
?????????????? 自動管理模式設置方便得多, 無需為pga里的sort_area/ hash_area/ bitmap_merge_area 等部分設置具體大小。而是在內存里劃出了1個空間作為1個總的公共SGA。
?????????????? 但是這個公共SGA也不是完全地由所有server process共享的, 一旦一個server process需要使用SGA,則會在公共SGA里劃出一塊空間單獨使用, 但使用完成后, 會自動把空間釋放回公共SGA里, 這樣, 負荷小的server process就不占用多余的SGA空間, 顯得很彈性化, 比較合理了。
??????????????? 但當1個負荷很重的process 需要大量的SGA空間時。 公共SGA也不會把全部的空間都劃給這個SGA的,因為一旦全部劃給它。 則其他的 server process有可能同時都產生磁盤排序或磁盤哈希連接了。? 而是只給1個上限值給這個高負荷的server process,讓它單獨一個磁盤排序..? 不影響其他server process
???????????????? 2.1 設置方法
???????????????? alter system set workarea_size_policy=auto scope=both; //默認就是autoalter system set pga_aggregate_target=512m scope=both; //將公共SGA大小上限設為512M
????????????????
????????????????? 2.2 應該設為多大才合適
????????????????? 在OLTP系統中, 典型PGA內存設置應該是內存的較小部分(例如15%), 剩下的80%交給SGA
????????????????? 在DSS系統(數據倉庫)中, 因為會運行依稀很大的查詢, PGA內存可以設大一點。 例如50%
?????????????????
????????????????? 2.3 pga_aggregate_target 其實并不是1個硬性指標, 而只是1個臨界值。
????????????????? 怎么說呢, 舉個例子:
?????????????????? 例如1個數據庫中pga_aggregate_target 設成60MB, 這時有3個server process, 第一個需要10MB, 那么PGA會按需給它10M, 第二個需要20MB, PGA給它20M. 第3個需要30M, 那么PGA把剩下的30M給它..
?????????????????? 這是PGA所有的內存都被占用了。這時來了第4條session, 服務器建立1個新的server process 需要10M PGA空間,但是公共PGA空間已經全部占用了,這時公共PGA會向內存再申請10M空間, 也就是說公共PGA到達pga_aggreate_target后也會自動擴容的, 區別就是這是公共PGA空間不會按需分配給第4條server process 10M 空間, 只會給1部分, 例如5MB.. 以后的第6條,第7條server process同樣道理, 智慧得到一部分所需要的PGA 空間, 除非SGA里的被占用空間被釋放回來。
?????????????????? 也就是說PGA空間占用到達pga_aggeratee_target時, 則肯定會發生磁盤排序或磁盤哈希連接, 但是并不是完全的磁盤內操作, 但是PGA其實也會自動擴容, 而且會給每1個新的server process所需的一部分pga內存空間。以避免它執行完全的磁盤排序或磁盤哈希連接。
???????????????? 2.4 每個session最大能分配多少sga空間
????????????????? 上面都提過了,實際上1個server process不能獨占公共PGA中的所有空間, Oracle中存在1個_pga_max_size, 指定1個session 最多能獲得多少pga空間。
?????????????????? 我們可以用下面語句來查詢這個值
??????????????????
?????????????????????? 執行結果:
?
??????????????????? 如上圖, 這個值是200M, 也就是說任意1個process pga上限是200M啦
?????????????
????????????? 2.5 查看當前session占用Pga情況
??????????????????? 其實我們也可以根據數據庫大概的session數量來決定公共PGA的大小.
????????????????????????? 可以用如下語句來察看當前各session 的pga使用情況:
執行結果:
? ? ? ? ? ? ? ? ?? 只有3個session啦. ??其中PGA_MAX_MEM意思是這個session占用過PGA的最大值. ??
? ? ? ? ? ? ? ? ? 2.6 利用$pga_advice_target 來決定公共PGA大小? ?
? ? ? ? ? ? ? ? ? 執行如下如句:
?????????????????????
? ? ? ? ? ? ? ? ? ? ?? 結果:
?????????
????????? 其中Cache_HIT_PREC 就是內存命中率,? EDTD_OVERALLOC_COUNT就是硬盤IO次數, 上圖中設為108MB就足夠了.
?????????????????????
?????????????????????? 2.7 數據庫當前內存排序和磁盤排序的次數
? ? ? ? ? ? ? ? ? ? ?? 執行如下如句:
? ? ? ? ? ? ? ? ? ? ? ? ? ?? select * from V$SYSSTATwhere name like '%sort%';
? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? 執行結果:
???????????????????????
????????????????????????? 可以見到磁盤排序次數為0, 當然我用的只是符合很小的學習數據庫啦.
??????????????????????????
?????? 但是在11g中, 使用的是AMM(Auto Memory Management)管理模式,pga的管理更加方便了, pga_aggregate_target 默認是0, 也就是說支持自動管理,會動態地增加和減少,但是大小不會超過memory_max_target 這個值.
????????????????????
?????????????????????
???????????????????
總結
- 上一篇: Oracle 的两种工作模式Dedica
- 下一篇: Oracle存储结构_文件