1、UGA (The User Global Area)
PGA是一段包含一個Oracle服務或後台進程的資料和控制資訊的記憶體。PGA的大小依賴與系統的配置。在專用服務(Dedicated Server)模式下,一個服務進程與一個使用者進程相關,PGA就包括了堆空間和UGA。而UGA(User Global Area使用者全域區)由使用者會話資料、遊標狀態和索引區組成。在共用服務(MTS)模式下,一個共用服務進程被多個使用者進程共用,此時UGA是Shared Pool或Large Pool的一部分(依賴與配置)。
許多DBA都不理解PGA和UGA之間的區別。其實這種區別可以簡單的理解為進程和會話直接的區別。在專用服務模式下,進程和會話是一對一的;而在MTS模式下,進程和會話是一對多的關係。PGA是服務於進程的,它包含的是進程的資訊;而UGA是服務於會話的,它包含的是會話的資訊。因此,MTS模式下,PGA和UGA之間的關係也是一對多的。
UGA中包含了一個會話的資訊,包括:
1)開啟遊標的永久區和運行區;
2)包的狀態資訊,特別是包的變數;
3)Java會話的資訊;
4)啟用的角色;
5)啟用的跟蹤事件(ALTER SESSION SET EVENT …);
6)起作用的NLS參數(SELECT * FROM NLS_SESSION_PARAMETERS;);
7)所有開啟的db link;
8)會話對於信任的Oracle的託管訪問標記(mandatory access control (MAC)
和PGA一樣,UGA也由兩組區組成,固定UGA和可變UGA(或者說UGA堆)。固定UGA包含了大概70個原子變數、小的資料結構以及指向UGA堆的指標。
UGA heap中的段可以通過表X$KSMUP查到(它的結構和X$KSMSP相同)。UGA堆包含了儲存一些固定表(X$表)的永久記憶體(依賴與特定參數的設定,如OPEN_CURSORS,OPEN_LINKS和MAX_ENABLED_ROLES)。除此以外,大部分的UGA用於私人SQL區。UGA記憶體的所在依賴於會話的設定。在專用服務模式下,會話和進程是一對一的關係,UGA位於PGA中。固定UGA是PGA中的一段記憶體段,而UGA堆是PGA的子堆。在MTS模式下,固定UGA是shared pool中的一段記憶體段,而UGA堆是Large Pool的子堆,如果從large pool分配失敗,則從shared pool中分配。
MTS模式下,可以通過Profile中的PRIVATE_SGA項(通過dba_profiles查看)來控制每個UGA佔用的SGA的總的大小,但是不建議這樣做。
Oracle 9.2以後,有一個新的隱含參數:_use_realfree_heap。當設定這個參數為true時,Oracle會為CGA、UGA單獨分配堆,而不從PGA中分配。它的預設值為false,而當設定了pga_aggregate_target後,它的值自動被改為true。
2、CGA (The Call Global Area)
與其他的全域區不同,CGA(Call Global Area調用全域區)的存在是瞬間的。它只存在於一個調用過程中。對於執行個體的一些低層次的調用需要CGA,包括:
1)解析一條SQL語句;
2)執行一條SQL語句;
3)取一條SELECT語句的輸出值。
如果語句產生了遞迴調用,則需要為每個遞迴調用分配一個CGA。如上所述,遞迴調用是在語句解析、最佳化器產生語句查詢計劃、DML操作時需要查詢或修改資料字典資訊的調用。
無論UGA存在於PGA還是SGA,CGA都是PGA的subheap。因為無論那種模式,會話在做調用時總需要一個進行進行處理。這一點很重要,特別是在MTS模式下時,如果發現一次調用很久沒有響應,則可能需要增加PGA的大小。
當然,調用並不是只通過CGA中的資料結構來工作。實際上,調用所需要的大部分的重要資料結構都來自於UGA。例如私人SQL取和排序區都存放在UGA中,因為調用結束後,它們是被保留的。CGA中只包含了那些調用結束後可以被釋放的資料。例如,CGA中包含了直接IO緩衝、關於遞迴調用的資訊、用於運算式評估(產生查詢計劃時)的的堆空間和其他一些臨時資料。
Java調用記憶體也分配在CGA中。它被分為三部分空間:堆空間、新空間和老空間。在調用期間(調用長短依賴於使用期長短和大小),在新空間和老空間中的記憶體段不再使用的記憶體段將被垃圾收集器回收。
3、軟體代碼區(Software Code Area)
軟體代碼區是一部分用於存放那些正在運行和可以被啟動並執行代碼(Oracle自身的代碼)的記憶體區。Oracle代碼一般儲存在一個不同於使用者程式儲存區的軟體代碼區,而使用者程式儲存區是排他的、受保護的地區。
軟體區的大小一般是固定的,只有Oracle軟體升級或重裝後才會改變。在不同作業系統下,這部分地區所要求的大小也不同。
軟體區是唯讀,可以被安裝成共用的或非共用的。可能的情況下,Oracle代碼是共用的,這樣所有Oracle使用者都可以直接存取這些代碼,而不需要各自儲存一份拷貝在自己的記憶體中。這樣可以節省大量記憶體並提高整體效能。
而使用者程式也可以是共用的或非共用的。一些Oracle工具(如SQL Plus)能被安裝成共用的,但有些不能。如果一台機器運行多個執行個體,這些執行個體可以使用同一個Oracle代碼區。
另外要注意的是:並不是所有作業系統都能將軟體區安裝成共用的,如Windows。
查看本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/