oracle concept-pga和共享sql 私有sql記載

dotaddjj發表於2011-10-20

oracle concepts的第八章記憶體管理中對於pgasql區真的不是很好理解,就把其中的要點難點摘要下來了,

程式全域性區pga是供服務程式儲存資料及控制資訊的記憶體區域。服務程式啟動時由oracle建立的非共享的記憶體區。只有服務程式才能訪問屬於她的PGA,對pga的讀寫操作由oracle程式碼實現的。

PGA的內容:

每個使用者都有自己的pga,記錄各種不同的連線至oracle伺服器的程式資訊,例如使用者名稱 密碼等。登陸oracle的會話會在伺服器端佔用一塊pga,會話剛登陸時,每個使用者佔用的pga大概幾百KB記憶體,並在以後動態收縮。

私有sql區中包含繫結資訊及執行時記憶體結構等資料。每個執行的sql語句的session都有一個私有sql區。提交相同sql語句都有自己的私有sql區,但使用同一共享sql區。同樣私有sql在專用伺服器模式下也儲存與PGA中。

遊標的私有sql區又分為:

持續資料區(繫結變數之類的資料),此區在遊標關閉時釋放。

執行時區,遊標執行完畢後就會釋放,執行時區維護會話的相關遊標,例如查詢時的scn,當前結果集的位置,工作區(排序 雜湊 點陣圖)也是執行時區一部分

Oracle執行使用者請求例如sql查詢首先需要建立遊標然後開啟遊標,遊標開啟後被執行前,這一段期間所使用的記憶體都是使用持續資料區記憶體。繫結資訊,sql宣告等還有用來和共享sql區關聯的sql地址資訊。

摘自tom大師:

執行計劃這些相關SQL的資訊,在共享池中只留一份,各個會話的UGA中的儲存指標.也就是說,在應用程式(SQL)中,應該存有相應DLL庫(共享SQL)的指標,憑這個指標,將私有SQL區與共享SQL區聯絡起來。
私有sql區的持續資料區中存放的這個指向共享SQL區的指標,和與之對應的SQL宣告文字,是持續區最重要的內容

私有sql區的持續資料區儲存的繫結變數 sql宣告等需要一個連線到共享sql的地址。

使用者程式管理私有sql區,私有sql區的分配和回收主要取決於使用者的應用程式,使用者程式可分配私有sql區,私有sql區的最大數量由open_cursors控制。

專有伺服器連線:私有sql區位於服務程式的pga,共享伺服器:私有sql區位於sga中。

在一個語句執行遊標(語句控制程式碼被釋放)被關閉後,相應的私有sql區才會被清除。

語句結束後,oracle會釋放其使用的執行時區,但是此語句使用的持續資料區還是會被保留,直到關閉遊標才會釋放其使用的持續資料區,從而減少應用程式所佔用的記憶體。

會話記憶體

使用者儲存會話的變數(登陸資訊)和會話相關的資訊。在共享伺服器下,會話記憶體為共享而不是某個會話私有。

Sql工作區

對於複雜查詢來說,執行時區的大部分容量用於需要記憶體的操作建立工作區之用。一般來說,更大工作區能夠顯著提高sql操作的效能,但是會消耗更多記憶體。(例如排序 分組 雜湊 點陣圖建立和融合等都會消耗pga中的sql工作區),sql工作區也是執行時區的一部分。

最好是工作區能夠容納sql語句的全部輸入資料及額外的控制記憶體結構。不然sql語句的響應時間增加,存在部分資料資料必須放在臨時磁碟區,資料資料需要在臨時磁碟區與工作區間多次交換,將影響sql操作的時間。

Pga的自動管理需要設定引數workarea_size_policy=autopga_aggregate_target分配給pga的值。

感覺這篇blog很亂,有些知識點自己真是沒有弄清楚,以前看pga記憶體看見了就逃避,慢慢地還是有了點自己的理解。

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1055838/,如需轉載,請註明出處,否則將追究法律責任。

相關文章