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

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

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

客戶端進程負載管理私有sql 區域,釋放和分配private sql area依據應用,但是我們可以使用open_cursor這個參數來進行控制client process 能夠打開的游標數量。
這個private sql area 被分為兩個區域:runtime area 和persistent area
1)runtime area
當執行一個請求的時候第一步就分配了runtime area,它包含查詢執行狀態信息,如我在一個全表掃描的時候,這個運行區就跟蹤在檢索的數目進度。當這個執行的dml sql語句結束的時候,該區域就會被釋放了。
2)persistent area:
該區域包含了變量值(bind variable),這個永久區域當游標被關閉的時候內存得以釋放:
eg:select * from t where name=:value;
那么value就是這個bind variable
sql work area:
? 該工作區在pga中被私有分配,使用與密集型操作,如我進行sort operator的時候,那么就會使用sort area 來存儲sort 的行,當我進行hash join的時候,那么我就會使用hash area來存儲相應的檢索內容,當使用bitmap merge的時候,那么就會使用bitmap merge area 來從位圖索引進行scan來合并數據。
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)
在這個執行計劃中可以看出sort order by是在sort area 中的,private sql 中的運行區域在calss表匯總執行了一個全表掃描的進度,這個會話執行了一個left join 在兩個表中獲取了相應數據。
當work area 工作區域很小的時候,不能夠容納鎖執行語句的數據信息,那么就會把執行的數據信息劃分為很多的數據piece,然后oracle緩慢的進行處理piece,其他的piece 會被暫時緩存到disk中,因此我們應該保證有足夠的內存給予work area一邊減小disk 的i/o,以便提高系統系能。
B)pga在共享服務器和專用服務器模式下組件的不同分配情況。
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 |
++++++++++++++++++++++++++++++++++++++++++++++++↖(^ω^)↗+++++++++++++
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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