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

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

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

客戶端進(jìn)程負(fù)載管理私有sql 區(qū)域,釋放和分配private sql area依據(jù)應(yīng)用,但是我們可以使用open_cursor這個(gè)參數(shù)來進(jìn)行控制client process 能夠打開的游標(biāo)數(shù)量。
這個(gè)private sql area 被分為兩個(gè)區(qū)域:runtime area 和persistent area
1)runtime area
當(dāng)執(zhí)行一個(gè)請求的時(shí)候第一步就分配了runtime area,它包含查詢執(zhí)行狀態(tài)信息,如我在一個(gè)全表掃描的時(shí)候,這個(gè)運(yùn)行區(qū)就跟蹤在檢索的數(shù)目進(jìn)度。當(dāng)這個(gè)執(zhí)行的dml sql語句結(jié)束的時(shí)候,該區(qū)域就會(huì)被釋放了。
2)persistent area:
該區(qū)域包含了變量值(bind variable),這個(gè)永久區(qū)域當(dāng)游標(biāo)被關(guān)閉的時(shí)候內(nèi)存得以釋放:
eg:select * from t where name=:value;
那么value就是這個(gè)bind variable
sql work area:
? 該工作區(qū)在pga中被私有分配,使用與密集型操作,如我進(jìn)行sort operator的時(shí)候,那么就會(huì)使用sort area 來存儲(chǔ)sort 的行,當(dāng)我進(jìn)行hash join的時(shí)候,那么我就會(huì)使用hash area來存儲(chǔ)相應(yīng)的檢索內(nèi)容,當(dāng)使用bitmap merge的時(shí)候,那么就會(huì)使用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)
在這個(gè)執(zhí)行計(jì)劃中可以看出sort order by是在sort area 中的,private sql 中的運(yùn)行區(qū)域在calss表匯總執(zhí)行了一個(gè)全表掃描的進(jìn)度,這個(gè)會(huì)話執(zhí)行了一個(gè)left join 在兩個(gè)表中獲取了相應(yīng)數(shù)據(jù)。
當(dāng)work area 工作區(qū)域很小的時(shí)候,不能夠容納鎖執(zhí)行語句的數(shù)據(jù)信息,那么就會(huì)把執(zhí)行的數(shù)據(jù)信息劃分為很多的數(shù)據(jù)piece,然后oracle緩慢的進(jìn)行處理piece,其他的piece 會(huì)被暫時(shí)緩存到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號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
