認識PGA及PGA_AGGREGATE_TARGET [final]

tolywang發表於2013-04-23

一, PGA記憶體組成  
程式全域性區PGA是供服務程式儲存資料及控制資訊的記憶體區域, PGA可分固定PGA和
可變PGA。可變PGA是一個記憶體堆,PGA的可變區實際上是我們最為關注的PGA部分。
透過x$ksmpp可以查詢可變PGA的分配和使用情況。它主要由:
1). 會話記憶體:用於存放會話的登入資訊以及其他相關資訊
2). 私有sql區
  1.1) 永久區域: 這裡存放了相同SQL語句多次執行時都需要的一些遊標資訊,比如繫結
       變數資訊、資料型別轉換資訊,SQL宣告等。這部分記憶體只有在遊標被關閉時才會被
釋放。
  1.2) sql work area:含sort區、hash區等,對於DML事務,sql執行完畢就釋放該區域;
       對於select則是記錄返回後或者查詢取消時釋放。 這部分大小依賴於SQL複雜度,
       sort,hash使用及處理的行數及行的大小 等因素 。
3)  遊標和sql區域: 這裡的遊標是一塊記憶體,不是我們常指的"指標"。一個Oracle預編譯程式或OCI程式的應用開發人員能夠很明確的開啟一個遊標,或者控制一塊特定的私有SQL區,將他們作為程式執行的命名資源。另外,oracle隱含的為一些SQL語句產生的遞迴呼叫(讀取資料字典資訊)也使用共享SQL區。

PGA中我們最需要關注的就是私有SQL區域中的執行時區域(sql work area)。


二,PGA的主要消費者
oracle的應用程式或者使用者的應用程式在執行時,都可能顯示或者隱式地開啟cursor,
開啟cursor就需要分配sql area,私有sql區在cursor開啟時分配,關閉時釋放,實際上,資料庫的主要活動就是cursor的活動,簡單說來,使用者程式的任務執行和cursor的使用是PGA的主要消耗者。

server process去data dictionary cache查詢,將需要的讀到database buffer cache,
然後,在PGA構造遊標(結果集的指標),每一根指標都指向一個rowid,如果需要排序,
連線,一致性讀,則只需要對指標進行操作。所以,PGA是使用者最直接的使用體驗。

使用者所發出的請求,執行時,是在pga中執行(只有資料在buffer cache中)。若在pga
中命中(當某個session第三次執行相同的SQL語句時,則會把該SQL語句的遊標資訊轉移到該session的PGA中),則無須軟解析或者硬解析,此時俗稱為軟軟解析。 PGA中的遊標指向buffer cache中的資料行,返回時是一批一批返回,而非一條條。

-- 未完, 見評論部分 。


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

相關文章