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