日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

oracle 之 內(nèi)存—鞭辟近里(二)

系統(tǒng) 2090 0

?

overview of the pga
pga是在操作系統(tǒng)的進(jìn)程或是線程特定的一塊內(nèi)存區(qū)域,它不是共享的。因為pga是進(jìn)程指定的,因此它不會在sga中分配。
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;
??????? ID NAME??????????????????????? AGE??? CALSSID???????? ID CLASSNAME
---------- -------------------- ---------- ---------- ---------- --------------------
???????? 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
8 rows selected.
SQL> set autotrace trace explain;
SQL> r
? 1* select * from student s join class c on s.id=c.id(+) order by s.id desc
Execution Plan
----------------------------------------------------------
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 |
---------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
?? 5 - access("S"."ID"="C"."ID"(+))
?????? filter("S"."ID"="C"."ID"(+))
Note
-----
?? - dynamic sampling used for this statement (level=2)
SQL>
在這個執(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


++++++++++++++++++++++++++++++++++++++++++++++++↖(^ω^)↗+++++++++++++

?

oracle 之 內(nèi)存—鞭辟近里(二)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 定安县| 丰都县| 六枝特区| 鸡东县| 广平县| 平昌县| 保定市| 宿州市| 台北县| 岐山县| 龙陵县| 阿瓦提县| 喀喇沁旗| 朝阳县| 五原县| 若羌县| 乐业县| 莆田市| 台东县| 曲靖市| 白城市| 金沙县| 崇明县| 灵山县| 响水县| 荥经县| 阿拉尔市| 商城县| 砚山县| 滦平县| 武平县| 思茅市| 耿马| 长岭县| 浑源县| 射阳县| 安达市| 广德县| 霞浦县| 昔阳县| 迭部县|