Oracle記憶體結構研究 PGA篇

2021-08-31 05:41:50 字數 4919 閱讀 2865

一、概述

sga,pga,uga都是oracle管理的記憶體區。

sga(system global area),即系統全域性區,oracle中最重要的記憶體區。

pga(process global area),即程式全域性區,乙個程序的專用的記憶體區。

uga(user global area),即使用者全域性區,與特定的會話相關聯。

專用伺服器連線模式,uga在pga中分配。

共享伺服器連線模式,uga在sga中的large pool中分配。

如果採用專用伺服器連線模式,pga中包含uga,其他區域用來排序,雜湊和點陣圖合併。

簡單來講,pga=uga+排序區+雜湊區+點陣圖合併區。

二、pga的管理模式。

pga分兩種管理模式:

1)        手動pga記憶體管理,使用者指定排序區和雜湊區所使用的記憶體,每個連線使用相同的記憶體。

2)        自動pga記憶體管理,告訴oracle可以使用的pga的總量,由oraclce根據系統負載決定具體分配。

?        9ir1時預設為手動pga記憶體管理,9ir2以後預設為自動pga記憶體管理。

?        pga記憶體可以動態擴大和**。

pga記憶體管理模式由workarea_size_policy控制。

1)        設為manual,啟用手動記憶體管理。

2)        設為auto,並且pga_aggregate_target不為0時,啟用自動記憶體管理。

三、手動pga記憶體管理

有三個引數對pga影響最大。

sort_area_size:對資訊排序所用的記憶體總量

sort_area_retained_size:排序後在記憶體中儲存排序資訊的記憶體總量。

hash_area_size:儲存雜湊列表所用的記憶體量。

下面對這三個引數進行說明:

1)        sort_area_size:

如果sort_area_size設為512kb,sort_area_retained_size也為512kb,則oracle使用512kb的記憶體進行排序,排序後所有資料都留在記憶體中。

2)        sort_area_retained_size:

如果sort_area_size設為512kb,sort_area_retained_size設為384kb,則oracle使用512kb的記憶體進行排序,然後保留384kb的已排序資料,另外512kb-384kb=128kb的已排序資料會寫到臨時表空間中。

?        如果sort_area_retained_size沒有設定,則它的值為0,但是實際保留的排序資料和sort_area_size相同。

3)        hash_area_size:

乙個大集合和另個集合進行連線時,會用到hash_area_size引數。較小的 表會放到這部分記憶體中作為驅動表,然後大表進行探索(probe)操作進行連線。如果hash_area_size過小會影響兩個集合(表)連線時的效能。

注意點:

1)        如果需要排序的資料量大於sort_area_size,oracle會分批進行排序。把當前已排序的資料儲存到臨時表空間中,然後對剩餘的資料進行排 序。最後,還會對這些儲存在臨時表空間中的已排序資料再進行排序,因為每次儲存到臨時表空間中的已排序資料只是部分資料的排序,對整體需排序的資料來說只 是部分區域性有序。

2)        *_area_size只是對某個操作的限制,乙個查詢可能有多個操作,每個操作都有自己的記憶體區。如果sort_area_size設為5mb,乙個查詢可能會有10個排序操作,這樣乙個查詢會占用50mb的排序記憶體。

3)        3,*_area_size記憶體的分配是按需分配。如果乙個查詢需要5mb記憶體進行排序,就算分配1g的sort_area_size也不會全部使用,只會使用需要的5mb的記憶體量。

四、自動pga記憶體管理

要啟用自動pga記憶體管理,設定下列引數:

1,workarea_size_policy=auto

2,pga_aggregate_target=非零

有關pga_aggregate_target:

1)        pga_aggregate_target是乙個目標值。連線數少的時候實際分配pga記憶體會比它要小。連線數多的時候實際分配的pga記憶體會比它要大,但是oracle會努力保持總pga保持在pga_aggregate_target值內。

例如,pga_aggregate_target 設為300mb。5個使用者連線時,每個使用者可能分配10mb的pga記憶體,共分配50mb的pga記憶體。300個使用者連線時每個使用者可能分配1.3mb的 pga記憶體,共分配390mb的pga記憶體。當使用者連線多時,oracle會降低每個使用者的pga記憶體使用量。

2)        乙個序列查詢(非並行查詢)可能包括多個排序/雜湊操作,每個排序/雜湊操作最多使用5%的pga記憶體。

3)        乙個並行查詢最多可用到30%的pga記憶體,無論有多少並行程序。

五、手動pga記憶體管理與自動pga記憶體管理

自動pga記憶體管理相對於手動pga記憶體管理有很多優點

1,        當使用者連線少時

a)        手動pga記憶體管理不管有多少可用記憶體都按照預設值進行分配。比如當前空閒記憶體為300mb,連線需要10mb的記憶體進行排序,而我們設定的排序區大小為5mb,導致雖然有足夠的空閒記憶體卻無法分配給當前連線,造成執行效率低下。

b)        自動pga記憶體管理會根據當前空閒記憶體來進行分配。當空閒記憶體為300mb,當前使用者需要10mb記憶體進行排序,oracle就會分配10mb記憶體給當前使用者。

2,        當使用者連線多時

a)        手動pga記憶體管理會完全按照預設值分配記憶體。如果物理記憶體總量為1g,排序區設為5mb,當有300個使用者連線時,oracle會分配1.5g的記憶體,這已經超過了我們的實際物理記憶體!

b)        自動pga記憶體管理會根據當前連線情況進行分配。如果物理記憶體總量為1g,pga_aggregate_target為300mb,當使用者數從10公升到 300時,每個使用者連線的記憶體會從滿足需要的10mb慢慢減少到1.3mb,雖然最後總量也會超過pga_aggregate_target,但比起手動 pga記憶體管理要好很多了。

什麼時候使用自動pga記憶體管理?什麼時候使用手動pga記憶體管理?

白天系統正常執行時適合使用自動pga記憶體管理,讓oracle根據當前負載自動管理、分配pga記憶體。

夜裡使用者數少、進行維護的時候可以設定當前會話使用手動pga記憶體管理,讓當前的維護操作獲得盡可能多的記憶體,加快執行速度。

如:伺服器平時執行在自動pga記憶體管理模式下,夜裡有個任務要大表進行排序連線後更新,就可以在該操作session中臨時更改為手動pga記憶體 管理,然後分配大的sort_area_size和hash_area_size(50%甚至80%記憶體,要確保無其他使用者使用),這樣能大大加快系統運 行速度,又不影響白天高峰期對系統造成的影響。

六、操作命令

系統級更改:

alter system set workarea_size_policy = ;

alter system set pga_aggregate_target=100000000;

alter system set sort_area_size = 65536 scope = spfile;

alter system set hash_area_size = 65536 scope = spfile;

會話級更改

alter session set workarea_size_policy = ;

alter session set sort_area_size = 65536;

alter session set hash_area_size = 65536;

七、學以致用

1,排序區:

pga_aggregate_target為100mb,單個查詢能用到5%也就是5mb時排序所需時間

sql> create table sorttable as select * from all_objects;

表已建立。

sql> insert into sorttable (select * from sorttable);

已建立49735行。

sql> insert into sorttable (select * from sorttable);

已建立99470行。

sql> set timing on;

sql> set autotrace traceonly;

sql> select * from sorttable order by object_id;

已選擇198940行。

session級修改排序區為30mb所需時間

sql> alter session set workarea_size_policy = manual;

會話已更改。

會話已更改。

已選擇198940行。

可以看到所需時間從50.49秒減少到10.31秒,速度提公升很明顯。

2,雜湊區:

pga_aggregate_target為100mb,單個查詢能用到5%也就是5mb時表連線所需時間

sql> select /*+ use_hash(tb1 tb2)*/ * from sorttable tb1,sorttable tb2 where tb1.object_id=tb2.object_id;

已選擇49735行。

session級修改雜湊區為30mb所需時間

sql> alter session set workarea_size_policy = manual;

會話已更改。

會話已更改。

已選擇49735行。

所需時間由40.50秒提公升到4.47秒,效果同樣很明顯。

結論:在9ir2版以後,pga不再像以前那樣困擾dba了,oracle會幫我們做好pga的分配。但這並不意味著dba不需要深入了解pga了,掌握pga並根據適當應用會讓工作如虎添翼

oracle記憶體結構 第二節 手動PGA記憶體管理

上一節已經說過,如果採用專用伺服器連線模式,pga由uga與另外一部分記憶體組成。另外的那部分記憶體主要用來進行排序,位圖合併之類的。現在我們就來講講oracle如何管理這部分記憶體的。有幾個引數 sort area size 在資訊換出到磁碟之前,用於對資訊進行排序的記憶體總量。就是我給你分配多少...

oracle記憶體結構(第三節 自動PGA記憶體管理)

上一節我們看到了,我們可以通過設定sort area size來確定使用者的排序區的大小。這個時候有乙個問題,假設sort area size為2m,總共可用記憶體為1g。現在併發使用者為10個,最多的時候只是用了20m,並沒有充分利用記憶體。如果乙個使用者在排序的時候最多需要用5m的空間,你卻把s...

PGA 記憶體自動管理

pga 記憶體自動管理 sql 工作區可以是自動的 全域性的管理。dba 只要設定引數 pga aggregate target 給乙個例項的 pga 記憶體指定總的大小。設定這個引數後,oracle 將它作為乙個總的全域性限制值,盡量使所有 oracle 服務程序的 pga 記憶體總數不超過這個值...