PGA结构
當(dāng)客戶端向服務(wù)器發(fā)送連接請求,服務(wù)器監(jiān)聽到客戶端的請求,在專用服務(wù)器模式下,會在服務(wù)器端衍生一個server process來代理客戶的請求,server process進(jìn)而向?qū)嵗l(fā)起連接,創(chuàng)建會話,而PGA就為server process所分配和使用。
PGA,這P,或譯之程序,或翻為私有,角度不同而已,通常,我們稱之”程序全局區(qū)“。它的創(chuàng)建時期:
1)server process啟動或創(chuàng)建時分配,原因?無他,唯PGA和server process是”一根繩上的兩個螞蚱“。相濡以沫,患難一共。
? 2)系統(tǒng)運(yùn)行時,sort、hash join等操作也可能需要進(jìn)一步的PGA分配
PGA為server process排他訪問,故不存在latch爭用。它包含了server process的數(shù)據(jù)和控制信息。通過C語言的運(yùn)行時調(diào)用malloc()在本地分配,可動態(tài)擴(kuò)縮。PGA是私有的而不是共享的,這個機(jī)制是有必要的,因?yàn)楫?dāng)進(jìn)程死掉后可以把這些資源清除和釋放掉.
oracle的應(yīng)用程序或者用戶的應(yīng)用程序在執(zhí)行時,都可能顯示或者隱式地打開cursor,打開cursor就需要分配sql area,私有sql區(qū)在cursor打開時分配,關(guān)閉時釋放,實(shí)際上,數(shù)據(jù)庫的主要活動就是cursor的活動,簡單說來,用戶進(jìn)程的任務(wù)執(zhí)行和cursor的使用是PGA的主要消耗者。
用戶體驗(yàn)最敏感的貢獻(xiàn)就在于PGA。用戶所發(fā)出的請求,執(zhí)行時,是在pga中執(zhí)行。若在pga中命中,則無須軟解析或者硬解析,此時稱為軟軟解析。pga中的游標(biāo)指向buffer cache中的數(shù)據(jù)行。返回時,是一批批,而非一條條。
PGA可分固定PGA和可變PGA。可變PGA是一個內(nèi)存堆,PGA的可變區(qū)實(shí)際上是我們最為關(guān)注的PGA部分。通過x$ksmpp可以查詢可變PGA的分配和使用情況。它主要由:
? a)會話內(nèi)存:用于存放會話的登錄信息以及其他相關(guān)信息
? b)私有sql區(qū)
??? b1)永久區(qū)域:含綁定變量,這部分內(nèi)存只有在cursor關(guān)閉時才會被釋放
??? b2)sql work area:含sort區(qū)、hash區(qū)等,對于DML事務(wù),sql執(zhí)行完畢就釋放該區(qū)域;對于select則是記錄返回后或者查詢?nèi)∠麜r釋放
c)游標(biāo)和sql區(qū)域:這里的游標(biāo)是一塊內(nèi)存,不是我們常指的“指針”
私有sql區(qū)的sql工作區(qū)太小會造成磁盤I/O,為均衡執(zhí)行sql所需的內(nèi)存與實(shí)際空間的分配,不得不將作業(yè)轉(zhuǎn)換到臨時表空間,因此,oracle將所得的sql工作區(qū)按大小分:
? a)optimal size:sql工作區(qū)完全可以滿足執(zhí)行sql所需的內(nèi)存
? b)one-pass size:與臨時表空間進(jìn)行一次I/O
? c)multi-pass size:與臨時表空間進(jìn)行多次I/O
?? 當(dāng)workload不大時,oracle傾向于為每個用戶會話分配optimal size sql工作區(qū).
UGA就是你的會話狀態(tài)。你的會話總能訪問這部分內(nèi)存。UGA的位置取決你如何連接oracle。如果是專用服務(wù)器連接,UGA在PGA中創(chuàng)建;如果是共享服務(wù)器連接,UGA則在SGA中創(chuàng)建。所以,PGA包含進(jìn)程內(nèi)存,還可能包含UGA。
轉(zhuǎn)載于:https://www.cnblogs.com/wcwen1990/p/6656564.html
總結(jié)
- 上一篇: Flask 生成下载文件
- 下一篇: source insight增加tab标