PGA
PGA(Program Global Area程式全域區)是一塊包含一個服務進程的資料和控制資訊的記憶體地區。 它是Oracle在一個服務進程啟動是建立的,是非共用的。一個Oracle進程擁有一個PGA記憶體區。一個PGA 也只能被擁有它的那個服務進程所訪問,只有這個進程中的Oracle代碼才能讀寫它。因此,PGA中的結 構是不需要Latch保護的。
我們可以設定所有服務進程的PGA記憶體總數受到執行個體分配的總體PGA(Aggregated PGA)限制。
在專有伺服器(Dedicated Server)模式下,Oracle會為每個會話啟動一個Oracle進程;而在多線 程服務(Multi-Thread Server MTS)模式下,由多個會話共用通一個Oracle服務進程。
PGA中包含了關於進程使用到的作業系統資源的資訊,以及一些關於進程狀態的資訊。而關於進程使 用的Oracle共用資源的資訊則是在SGA中。這樣做可以使在進程以外中止時,能夠及時釋放和清除這些 資源。
·Stack Space是用來儲存使用者會話變數和數組的儲存地區;
·User Session Data是為使用者會話使用的附加儲存區。
|--Session Information
|--Sort Area
|--Cursor Information
注意Session information(使用者會話資訊)在獨佔伺服器中與在共用伺服器中所處的記憶體地區是不 同的。
2.1 PGA的組成
PGA由兩組地區組成:固定PGA和可變PGA(或者叫PGA堆,PGA Heap【堆——Heap就是一 個受管理的記憶體區】)。固定PGA和固定SGA類似,它的大小時固定的,包含了大量原子變數、小的資料 結構和指向可變PGA的指標。
可變PGA是一個記憶體堆。它的記憶體段可以通過視圖X$KSMPP(另外一個視圖X$KSMSP可以查到可變SGA 的記憶體段資訊,他們的結構相同)查到。PGA堆包含用於存放X$表的的記憶體(依賴與參數設定,包括 DB_FILES、CONTROL_FILES)。
總的來說,PGA的可變區中主要分為以下三部分內容:
1)私人SQL區;
2)遊標和SQL區
3)會話記憶體
2.1.1 私人SQL區(Private SQL Area)
私人SQL區包含了綁定變數值和運行時期記憶體結構資訊等資料。每一個運行SQL語句的會話都有一個 塊私人SQL區。所有提交了相同SQL語句的使用者都有各自的私人SQL區,並且他們共用一個共用SQL區。因 此,一個共用SQL區可能和多個私人共用區相關聯。
一個遊標的私人SQL區又分為兩個生命週期不同的區:
永久區:包含綁定變數資訊。當遊標關閉時被釋放。
運行區:當執行結束時釋放。
建立運行區是一次執行請求的第一步。對於INSERT、UPDATE和DELETE語句,Oracle在語句運行結束 時釋放運行區。對於查詢操作,Oracle只有在所有記錄被fetch到或者查詢被取消時釋放運行區。
2.1.2 遊標和SQL區(Cursors and SQL Areas)
一個Oracle先行編譯程式或OCI程式的應用開發人員能夠很明確的開啟一個遊標,或者控制一塊特定的 私人SQL區,將他們作為程式啟動並執行命名資源。另外,oracle隱含的為一些SQL語句產生的遞迴調用(前 面有介紹,讀取資料字典資訊)也使用共用SQL區。
私人SQL區是由使用者進程管理的。如何分配和釋放私人SQL區極大的依賴與你所使用的應用工具。而 使用者進程可以分配的私人SQL區的數量是由參數OPEN_CURSORS控制的,它的預設值是50。
在遊標關閉前或者語句控制代碼被釋放前,私人SQL區將一直存在(但其中的運行區是在語句執行結束時 被釋放,只有永久區一直存在)下去。應用開發人員可以通過將所有開啟的不再使用的遊標都關閉來釋 放永久區,以減少使用者程式所佔用的記憶體。