?
pga是一個內(nèi)存堆,其中包含了被專用服務(wù)器或是共享服務(wù)器金曾鎖需要的一些會話變量信息。服務(wù)器進(jìn)程需要在pga中分配一些所需的內(nèi)存結(jié)構(gòu)。
一個比喻為,pga是一個臨時的文件管理員的工作區(qū)域,這個文件管理員就是服務(wù)進(jìn)程,她是為客戶服務(wù)工作的(client process),然后文件管理員把工作區(qū)域分為很多的區(qū)域,然后來處理或是保存客戶的不同信息,當(dāng)這個工作完成的時候,那么相關(guān)區(qū)域的空間就會被釋放掉。
如下圖,顯示了在專用服務(wù)器模式下所有的進(jìn)程分配的pga的信息(注意background 進(jìn)程也是需要分配pga的),可以使用一個初始化參數(shù)設(shè)置一個大的instance pga 值,然后每個私有的pga分別占用instance pga的一部分size:

A)pga 組件內(nèi)容
pga是被劃分為很多不同的區(qū)域的,每個區(qū)域都有不同的目的功能。下面是一個專用服務(wù)器模式下pga的內(nèi)存分配情況,并不是所有的組件都是必須存在的。

看到很多大師把pga分成兩部分,一部分為fixed area(固定區(qū)域)和variable area(可變區(qū)域),
可變區(qū)域又分為會話內(nèi)存(session memory)和私有sql區(qū)(private sql area),私有sql區(qū)又分為永久區(qū)域(persistent area)和運行區(qū)域(runtime area 和sql work areas)。
我想這樣分也是有意義的,先按照官網(wǎng)文檔分發(fā)的就如上圖所示了。
private sql area:
私有sql區(qū)包含一些關(guān)于sql語句解析的信息以及其他進(jìn)程相關(guān)的會話信息。當(dāng)一個服務(wù)進(jìn)程處理sql或是pl/sql代碼的時候,進(jìn)程就會使用私有sql去來存儲變量信息和語句查詢執(zhí)行狀態(tài)信息以及語句執(zhí)行區(qū)域信息。
private sql area 在uga中,通過使用共享sql區(qū)域來存儲語句執(zhí)行計劃,這些在sga中分配。
1)shared sql area:
當(dāng)一個sql語句第一次被執(zhí)行的時候,那么數(shù)據(jù)庫就會使用shared sql area 去處理折條語句,這個區(qū)域是共享的,可以被其他用戶所訪問,其中包含了語句的執(zhí)行分析樹以及執(zhí)行計劃。在這個區(qū)域中每個shared sql area為一個唯一的語句存在。(詳細(xì)內(nèi)容將在sga和shared pool中進(jìn)行說明)
2)private sql area
當(dāng)一個會話執(zhí)行一個sql語句的時候,這個私有sql area 就會在pga中進(jìn)行分配了。每個session都會有一個private sql area,如果執(zhí)行同一個sql那么會指向同一個shared sql area。
eg:我執(zhí)行了select * from t在一個session中執(zhí)行20此和在10個不同的session執(zhí)行同樣這條語句,那么會共享同樣的sql語句執(zhí)行計劃。但是private area 可能是不能夠被共享的,因為其中可能存儲的不同的變量值和數(shù)據(jù)。
其實我們在進(jìn)行dml以及ddl操作的時候隱含的都是打開cursor,每個游標(biāo)都作為客戶端一邊指向服務(wù)端的一條指針,每個游標(biāo)打開都會分配相應(yīng)的private sql area。因此在應(yīng)用開發(fā)的過程中應(yīng)該及時釋放關(guān)閉游標(biāo),釋放內(nèi)存占用,以提高內(nèi)存使用率。

客戶端進(jìn)程負(fù)載管理私有sql 區(qū)域,釋放和分配private sql area依據(jù)應(yīng)用,但是我們可以使用open_cursor這個參數(shù)來進(jìn)行控制client process 能夠打開的游標(biāo)數(shù)量。
這個private sql area 被分為兩個區(qū)域:runtime area 和persistent area
1)runtime area
當(dāng)執(zhí)行一個請求的時候第一步就分配了runtime area,它包含查詢執(zhí)行狀態(tài)信息,如我在一個全表掃描的時候,這個運行區(qū)就跟蹤在檢索的數(shù)目進(jìn)度。當(dāng)這個執(zhí)行的dml sql語句結(jié)束的時候,該區(qū)域就會被釋放了。
2)persistent area:
該區(qū)域包含了變量值(bind variable),這個永久區(qū)域當(dāng)游標(biāo)被關(guān)閉的時候內(nèi)存得以釋放:
eg:select * from t where name=:value;
那么value就是這個bind variable
sql work area:
? 該工作區(qū)在pga中被私有分配,使用與密集型操作,如我進(jìn)行sort operator的時候,那么就會使用sort area 來存儲sort 的行,當(dāng)我進(jìn)行hash join的時候,那么我就會使用hash area來存儲相應(yīng)的檢索內(nèi)容,當(dāng)使用bitmap merge的時候,那么就會使用bitmap merge area 來從位圖索引進(jìn)行scan來合并數(shù)據(jù)。
eg:
SQL> select * from student s join class c on s.id=c.id(+) order by s.id desc;
---------- -------------------- ---------- ---------- ---------- --------------------
???????? 8 h??????????????????????????? 20????????? 2
???????? 7 g??????????????????????????? 26????????? 3
???????? 6 f??????????????????????????? 25????????? 1
???????? 5 e??????????????????????????? 23????????? 3
???????? 4 d??????????????????????????? 23????????? 1
???????? 3 c??????????????????????????? 22????????? 1????????? 3 3
???????? 2 b??????????????????????????? 21????????? 2????????? 2 2
???????? 1 a??????????????????????????? 20????????? 1????????? 1 1
SQL> r
? 1* select * from student s join class c on s.id=c.id(+) order by s.id desc
----------------------------------------------------------
Plan hash value: 537866712
| Id? | Operation???????????????????? | Name??????? | Rows? | Bytes | Cost (%CPU)| Time???? |
---------------------------------------------------------------------------------------------
|?? 0 | SELECT STATEMENT????????????? |???????????? |???? 8 |?? 608 |???? 5? (40)| 00:00:01 |
|?? 1 |? SORT ORDER BY??????????????? |???????????? |???? 8 |?? 608 |???? 5? (40)| 00:00:01 |
|?? 2 |?? MERGE JOIN OUTER??????????? |???????????? |???? 8 |?? 608 |???? 4? (25)| 00:00:01 |
|?? 3 |??? TABLE ACCESS BY INDEX ROWID| STUDENT???? |???? 8 |?? 408 |???? 1?? (0)| 00:00:01 |
|?? 4 |???? INDEX FULL SCAN?????????? | PRIMARY_KEY |???? 8 |?????? |???? 1?? (0)| 00:00:01 |
|*? 5 |??? SORT JOIN????????????????? |???????????? |???? 3 |??? 75 |???? 3? (34)| 00:00:01 |
|?? 6 |???? TABLE ACCESS FULL???????? | CLASS?????? |???? 3 |??? 75 |???? 2?? (0)| 00:00:01 |
---------------------------------------------------------------------------------------------
---------------------------------------------------
?????? filter("S"."ID"="C"."ID"(+))
-----
?? - dynamic sampling used for this statement (level=2)
在這個執(zhí)行計劃中可以看出sort order by是在sort area 中的,private sql 中的運行區(qū)域在calss表匯總執(zhí)行了一個全表掃描的進(jìn)度,這個會話執(zhí)行了一個left join 在兩個表中獲取了相應(yīng)數(shù)據(jù)。
當(dāng)work area 工作區(qū)域很小的時候,不能夠容納鎖執(zhí)行語句的數(shù)據(jù)信息,那么就會把執(zhí)行的數(shù)據(jù)信息劃分為很多的數(shù)據(jù)piece,然后oracle緩慢的進(jìn)行處理piece,其他的piece 會被暫時緩存到disk中,因此我們應(yīng)該保證有足夠的內(nèi)存給予work area一邊減小disk 的i/o,以便提高系統(tǒng)系能。
B)pga在共享服務(wù)器和專用服務(wù)器模式下組件的不同分配情況。
Memory Area | Dedicated Server | Shared Server |
---|---|---|
Nature of session memory |
Private |
Shared |
Location of the persistent area |
PGA |
SGA |
Location of the run-time area for DML/DDL statements |
PGA |
PGA |
++++++++++++++++++++++++++++++++++++++++++++++++↖(^ω^)↗+++++++++++++
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
