PGA內存空間的分配與回收

一、UGA由哪幾部分組成?

 


由上述圖片可知,

一個會話裏如果處理的是SQL語句,那麼在shared pool中就有該SQL語句對應的Shared  Areas,該Shared  Areas的類型爲Shared SQL  Areas,在該會話對應的進程對應的uga中,就有該SQL語句對應的Private Areas,該Private  Areas的類型爲PrivateSQL Areas。當然由於當一個SQL語句執行完畢後它對應的PrivateSQL Area也會釋放掉,又一個會話裏同時只有一個SQL語句執行,所以該會話對應的進程對應的uga中始終最多隻有一個Private SQL Area存在。

一個會話裏如果處理的是 PL/SQL programunits,那麼在shared pool中就有該 PL/SQL program units對應的Shared Areas,該Shared  Areas的類型爲SharedPL/SQL  Areas,在該會話對應的進程對應的uga中,就有該SQL語句對應的Private Areas,該Private  Areas的類型爲PrivatePL/SQL Areas。當然由於當一個PL/SQL program units執行完畢後它對應的Private SQL Area也會釋放掉,又一個會話裏同時只有一個PL/SQL program units執行,所以該會話對應的進程對應的uga中始終最多隻有一個Private PL/SQLAreas存在。

由此可知,uga裏必然包括session  memory,而private sqlarea這個部分是當有SQL語句運行時存在於uga裏,PrivatePL/SQL Area也是如此

如果oracle還安裝了OLAP組件,那麼uga裏也必有theOLAP pool。

uga組成部分結論的得出過程:

Pgauga分別包含哪些部分?

 

uga處於pga中(專用服務器模式)時,兩者的分別包含哪些部分是否很清楚:uga全部處於pga中,uga包括session memory(記錄會話信息)和私有sql區(包括the persistent area the runtime area(包括sql工作區和query  execution stateinformation(即記錄SQL語句執行進度的部分)兩部分)兩部分)。

uga處於sga中(共享服務器模式)時,兩者的分別包含哪些部分分別可理解爲以下三種說法:

首先說明的是,按照oracle11gR2官方文檔裏的圖示(http://docs.oracle.com/cd/E11882_01/server.112/e40540/memory.htm#i14490),sql工作區不包含在私有sql區的,uga就是圖示中的session  memory。按照oracle10g官方文檔的說法,sql工作區是包含在私有sql區的。

 

 

Memory Area

Dedicated Server

Shared Server

Nature of session memory

Private

Shared

Location of the persistent area

PGA

SGA

Location of part  of the  run-time area forSELECT statements

PGA

PGA

Location of the run-time area for DML/DDL statements

PGA

PGA

再參考上述來自oracle11gR2官方文檔裏的表格(http://docs.oracle.com/cd/B19306_01/server.102/b14220/memory.htm#i14490),可理解出三種說法。

第一種,uga就是圖示中的session  memoryuga處於sga中,而thepersistent area也處於sga中,那麼the persistent area還是pga的一部分嗎?還是說

第二種,上述表格中處於sga裏的都是uga的組成部分。

第三種,uga包括session  memoryprivate sql area兩部分,當uga對應的進程是共享服務器進程時,那麼uga分成兩塊,分別放在pgasga上。

個人傾向認同第三種。

 

oracle10gR2官方文檔對Library Cache解釋:

 

LibraryCache

The librarycache includes the shared SQL areas, private SQL areas (in the case of a shared serverconfiguration), PL/SQL procedures andpackages, and control structures suchas locks and library cache handles.

 

從上面的表格可以看出,這裏說的共享服務器模式時共享服務器進程的private SQL areas應該是部分在Library Cache上。

 

 

 

 

 

二、PGA上內存空間的分配與回收的方式

 

引言:

0、PGA上內存空間的分配與回收的過程可能會引起ora-4030。發生ora-4030,是可能因爲操作系統的內存耗盡沒有多餘可以再分配了。

1、Pgauga佔了大頭,ugasql工作區又佔了大頭。

2、自動管理pga實際上調整的就是SQL工作區域(SQL Work Area

3、從V$PROCESS_MEMORY中字段CATEGORY上可以看出pga上內存空間分別用於什麼用途,即pga上內存空間可以分成包括Freeable在內的六種類型。

 

正文

1




 

從上面可得出如下結論:

無論是手動管理pga(的內存分配回收),還是自動管理pga(的內存分配回收),假設當一個進程產生時它對應的pga分配的空間大小爲A,使用的空間大小爲B,則當該進程運行一SQL語句時,要用到sql工作區,故而此時pga分配的空間大小和使用的空間大小就要變大,即pga分配的空間大小變爲C,使用的空間大小變爲D

而當該SQL語句執行完畢後,就會釋放sql工作區。此時,在手動管理pga(的內存分配回收)模式下,sql工作區所釋放的空間就會釋放給pga,故pga分配的空間大小依然爲C,使用的空間大小變爲B。在自動管理pga(的內存分配回收)模式下,sql工作區所釋放的空間就會釋放給操作系統,故pga分配的空間大小變爲A,使用的空間大小變爲B

 

在手動管理pga(的內存分配回收)模式下,uga(包括其中的sql工作區)和cga所需的內存分配是從原本已有分配的pga上分配,如果原來操作系統給該pga分配的內存空間中不能分配出uga(包括其中的sql工作區)和cga所需的內存空間,則pga會先向操作系統申請內存分配給自己,再之後分配給uga(包括其中的sql工作區)和cga所需的內存。所以,釋放的sql工作區所佔的內存空間回收給pga,故而會產生pga內存空間可能一直增大的情況。

 

在自動管理pga(的內存分配回收)模式下,uga(包括其中的sql工作區)和cga所需的內存分配是直接從操作系統上分配,而不是從原本已有分配的pga上分配的,所以,釋放的sql工作區所佔的內存空間回收給操作系統,故而不會產生pga內存空間可能一直增大的情況,而有增有減。當然,這些從操作系統上分配的uga(包括其中的sql工作區)和cga的內存空間加上原本已有分配的pga內存空間,就成爲該pga內存空間的新值,從V$PROCESS上的字段 PGA_ALLOC_MEM(或是PGA_USED_MEM)有增減變化這一現象或是從V$PROCESS_MEMORY上字段 CATEGORY 比如爲SQL     字段ALLOCATED(或是USED)有增減變化這一現象可以看出。

 

 

2、一個進程在視圖V$PROCESS_MEMORY上各個字段CATEGORY值對應的ALLOCATED值之和,等於該進程在視圖V$PROCESS上字段PGA_ALLOC_MEM值。同理,一個進程在視圖V$PROCESS_MEMORY上各個字段CATEGORY值對應的USED值之和,等於該進程在視圖V$PROCESS上字段PGA_USED_MEM值。

 

一個進程在視圖V$PROCESS_MEMORY上字段CATEGORY值爲Freeable對應的ALLOCATED值,等於該進程在視圖V$PROCESS上字段PGA_FREEABLE_MEM

值。

 

剛開始以爲視圖V$PROCESS 中PGA_ALLOC_MEM字段減去 PGA_USED_MEM 字段  所得的差值就是等於PGA_FREEABLE_MEM字段的值。但是實際上,發現不是這樣,看到自己電腦上的顯示的 V$PROCESS結果裏,PGA_FREEABLE_MEM字段的值都是爲0,而PGA_ALLOC_MEM字段減去 PGA_USED_MEM 字段  所得的差值都不是0。因爲內存空間的分配和使用這兩個概念是軟件設計中常用的管理內存空間的手段。例如,創建一個表時,會分配以一個區段大小爲單位的整數倍的空間給該表,而當向表中添加數據時(也就是使用該表時),則是按一個oracle數據塊的空間大小爲單位來使用,即按數據塊大小來添加數據的。再如,window下用的記事本文件都是先分配一定大小(假設爲A)的空間,如果使用該記事本文件的大小超過了該分配的空間,則又會再分配一定大小(也爲A)的空間給該記事本文件。如下圖所示:



圖示裏大小:69字節表示該記事本文件已經使用了的空間大小,而佔用空間:4096字節則表示操作系統給該記事本文件分配的空間大小。

那麼視圖V$PROCESS 中的PGA_FREEABLE_MEM字段表示什麼呢?

我們可以從對V$PROCESS_MEMORY中字段CATEGORY的解釋中得知:

Category name. Categoriesinclude "SQL", "PL/SQL", "OLAP" and"JAVA". Special categories are "Freeable" and"Other". Freeable memory has been allocated to theprocess by the operating system, but has not been allocated to a category."Other" memory has been allocated to a category, but not to one ofthe named categories.

從上面的解釋中可以發現,pga上內存空間可以分成包括Freeable在內的六種類型。比如,會話執行sql語句時pga上就會有一塊SQL類型的區域,執行PL/SQL存儲過程時pga上就會有一塊PL/SQL類型的區域。包括Freeable在內的每一個CATEGORY都有自己的ALLOCATED和USED屬性。只是還不知道在什麼情況下一個進程對應的pga裏的Freeable是不爲0。因爲在V$PROCESS_MEMORY中CATEGORY例如爲SQL,假如一個sql工作區釋放時,則其對應的ALLOCATED和USED屬性值也會下降,但是這些釋放的空間似乎不是放到CATEGORY爲Freeable的這裏,它對應的ALLOCATED和USED屬性值還是爲0.

在手動管理pga(的內存分配回收)模式(即_use_realfree_heap=true時)下,例如SQL工作區的內存空間回收給了pga(裏的uga,專用服務器模式時),則那麼該回收的空間會給Freeable的這裏嗎?

 

 

視圖V$PGASTAT 上的字段total freeable PGA memory的值等於數據庫當前各個進程在視圖V$PROCESS上字段PGA_FREEABLE_MEM值之和。

 

PGA memory freed back to OS字段值是字段totalfreeable PGA memory的值的累計值。(?)


註釋:

1、pga內存主要用於排序(當一個SQL語句中有排序操作時)等操作,因爲pga內存的大部分空間爲SQL工作區所佔。

2、pga中不是有CGA是用於例如分析調用、提取調用等(暫時存放的結果集)嗎?那麼一個沒有帶有排序等操作的SQL語句執行時,是否會把結果集先存放在CGA中?可以通過如下方法驗證:

在運行一個沒有帶有排序等操作的SQL語句期間,查看v$process的use字段是否變大,或是查看v$process_memory的cartory字段爲other時對應的use字段是否變大?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章