當(dāng)oracle數(shù)據(jù)庫(kù)實(shí)例啟動(dòng)的時(shí)候,oracle數(shù)據(jù)庫(kù)會(huì)分配一個(gè)內(nèi)存區(qū)并且會(huì)啟動(dòng)后臺(tái)進(jìn)程。
創(chuàng)新互聯(lián)公司專(zhuān)注于神池企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開(kāi)發(fā),商城建設(shè)。神池網(wǎng)站建設(shè)公司,為神池等地區(qū)提供建站服務(wù)。全流程按需策劃,專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)公司專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)
內(nèi)存區(qū)存儲(chǔ)的信息如下:
·程序代碼
·每個(gè)連接會(huì)話的信息,包括當(dāng)前沒(méi)激活的會(huì)話
·程序執(zhí)行過(guò)程中需要的信息,比如正在獲取當(dāng)前行的查詢狀態(tài)
·在進(jìn)程間共享和通信的鎖數(shù)據(jù)信息
·緩存數(shù)據(jù),比如數(shù)據(jù)塊和重作記錄,它們也會(huì)存在于磁盤(pán)
基礎(chǔ)的內(nèi)存結(jié)構(gòu)
oracle數(shù)據(jù)庫(kù)包含幾個(gè)內(nèi)存區(qū)域,每個(gè)內(nèi)存區(qū)域都包含好幾個(gè)子組件
與oracle數(shù)據(jù)庫(kù)相關(guān)的基礎(chǔ)內(nèi)存結(jié)構(gòu)包括:
System global area (SGA) 系統(tǒng)全局區(qū)
SGA是一組共享內(nèi)存結(jié)構(gòu),稱(chēng)為SGA組件,包含一個(gè)oracle數(shù)據(jù)庫(kù)實(shí)例的數(shù)據(jù)和控制文件信息。所有的服務(wù)器進(jìn)程和后臺(tái)進(jìn)程共享SGA內(nèi)存區(qū),SGA中存儲(chǔ)的數(shù)據(jù)包括緩存的數(shù)據(jù)塊和SQL共享區(qū)域。
Program global area (PGA) 程序全局區(qū)
PGA是一個(gè)非共享內(nèi)存區(qū)域,它只包含用于Oracle進(jìn)程使用的數(shù)據(jù)和控制信息。當(dāng)Oracle進(jìn)程啟動(dòng)時(shí),Oracle數(shù)據(jù)庫(kù)創(chuàng)建PGA。
每個(gè)服務(wù)器進(jìn)程和后臺(tái)進(jìn)程都有它自己的PGA內(nèi)存區(qū),單個(gè)PGA的集合是總的實(shí)例PGA的大小,在系統(tǒng)初始化參數(shù)中設(shè)置的是實(shí)例PGA的大小。
User global area (UGA) 用戶全局區(qū)
UGA是與用戶會(huì)話相關(guān)聯(lián)的內(nèi)存。
Software code areas
軟件代碼區(qū)是用來(lái)存儲(chǔ)正在運(yùn)行或可以運(yùn)行代碼的區(qū)域。Oracle數(shù)據(jù)庫(kù)代碼存儲(chǔ)在一個(gè)軟件領(lǐng)域,通常在不同的位置,從用戶程序——更高級(jí)的或受保護(hù)的位置。
下圖顯示了這些內(nèi)存之間的關(guān)系:
oracle 數(shù)據(jù)庫(kù)內(nèi)存管理
內(nèi)存管理包括為oracle數(shù)據(jù)庫(kù)實(shí)例內(nèi)存結(jié)構(gòu)分配最佳大小,以滿足數(shù)據(jù)庫(kù)更改的需求。oracle數(shù)據(jù)庫(kù)內(nèi)存管理基于初始化相關(guān)內(nèi)存參數(shù)的設(shè)置
內(nèi)存管理的基本模式如下:
·內(nèi)存自動(dòng)化管理
先給數(shù)據(jù)庫(kù)實(shí)例分配一個(gè)目標(biāo)內(nèi)存大小,實(shí)例會(huì)自動(dòng)調(diào)整到目標(biāo)內(nèi)存大小并根據(jù)需要在SGA和PGA之間重新分配內(nèi)存。
·自動(dòng)共享內(nèi)存管理
這種管理模式實(shí)現(xiàn)部分自動(dòng)化,為SGA設(shè)置了一個(gè)目標(biāo)大小,然后可以選擇為PGA設(shè)置聚合目標(biāo)大小,或者單獨(dú)管理PGA工作區(qū)域。
·內(nèi)存管理手冊(cè)
與設(shè)置總內(nèi)存大小不同,可以設(shè)置許多初始化參數(shù),以單獨(dú)管理SGA和實(shí)例PGA組件。
如果你通過(guò)DCBA(Database Configuration Assistant)創(chuàng)建oracle數(shù)據(jù)庫(kù)并選擇默認(rèn)的初始化設(shè)置,此時(shí)自動(dòng)化管理模式就是默認(rèn)的內(nèi)存管理模式。
UGA(User Global Area)概述
UGA是會(huì)話內(nèi)存,它是分配給會(huì)話變量的內(nèi)存,它主要存儲(chǔ)登錄信息、以及數(shù)據(jù)庫(kù)會(huì)話所需的其它信息,實(shí)際上UGA存儲(chǔ)的是會(huì)話的狀態(tài)。
下圖是UGA的結(jié)構(gòu):
如果會(huì)話將PL / SQL包加載到內(nèi)存中,那么UGA將包含包狀態(tài),即在特定時(shí)間存儲(chǔ)在所有包變量中的值集。
當(dāng)包的子程序更改變量時(shí)包的狀態(tài)也會(huì)發(fā)生更改,默認(rèn)情況下包變量是唯一的,并且會(huì)持久保存。
OLAP頁(yè)面池也存儲(chǔ)在UGA中。這個(gè)池管理OLAP數(shù)據(jù)頁(yè)面,它相當(dāng)于數(shù)據(jù)塊。頁(yè)面池是在OLAP會(huì)話開(kāi)始時(shí)分配的,并在會(huì)話結(jié)束時(shí)釋放。當(dāng)用戶查詢多維對(duì)象(如多維數(shù)據(jù)集)時(shí),OLAP會(huì)話將自動(dòng)打開(kāi)。
UGA對(duì)于數(shù)據(jù)庫(kù)會(huì)話必須是可用的。由于這個(gè)原因,在使用共享服務(wù)器連接時(shí),UGA不能存儲(chǔ)在PGA中,因?yàn)镻GA是特定于單個(gè)進(jìn)程的。因此,UGA在使用共享服務(wù)器連接時(shí)存儲(chǔ)在SGA中,使任何共享服務(wù)器進(jìn)程都可以訪問(wèn)它。當(dāng)使用專(zhuān)用的服務(wù)器連接時(shí),UGA存儲(chǔ)在PGA中。
PGA(Program Global Area)概述
PGA是oracle服務(wù)器進(jìn)程所獨(dú)有的內(nèi)存區(qū),而不是系統(tǒng)上其它進(jìn)程或線程所共享的內(nèi)存區(qū)。因?yàn)镻GA是特定于進(jìn)程的,所以它從來(lái)不是在SGA中分配的。
PGA是一個(gè)內(nèi)存堆,它包含專(zhuān)用和共享服務(wù)器進(jìn)程所需要的session變量。服務(wù)器進(jìn)程分配它在PGA中需要的內(nèi)存結(jié)構(gòu)。
下圖顯示了一個(gè)沒(méi)有為共享服務(wù)器配置的實(shí)例PGA(所有PGA的集合)。可以使用初始化參數(shù)設(shè)置PGA的最大值,個(gè)人PGA可以根據(jù)需要增加到這個(gè)目標(biāo)大小。
PGA詳細(xì)內(nèi)容
PGA被細(xì)分為不同的區(qū)域,每個(gè)區(qū)域都有不同的作用。
下圖為專(zhuān)用服務(wù)器會(huì)話所需的PGA內(nèi)存結(jié)構(gòu):
Private SQL Area(私有SQL區(qū))
一個(gè)Private SQL Area包含關(guān)于解析的SQL語(yǔ)句和其他特定會(huì)話特定信息的信息。
當(dāng)服務(wù)器進(jìn)程執(zhí)行SQL或PL / SQL代碼時(shí),進(jìn)程將會(huì)使用私有SQL區(qū)域存儲(chǔ)綁定變量值(綁定變量詳解http://blog.csdn.net/tianlesoftware/article/details/5458896)、查詢執(zhí)行狀態(tài)信息和查詢執(zhí)行工作區(qū)域。
不要混淆在PGA中的私有SQL區(qū)域和共享的SQL區(qū)域,共享SQL區(qū)域在SGA中存儲(chǔ)執(zhí)行計(jì)劃。在相同或不同的會(huì)話中,多個(gè)私有SQL區(qū)域可以指向SGA中的一個(gè)執(zhí)行計(jì)劃。例如,在一個(gè)會(huì)話中執(zhí)行“SELECT * FROM sales”的20次執(zhí)行和在不同會(huì)話中執(zhí)行相同查詢的10次執(zhí)行可以共享相同的計(jì)劃。每個(gè)執(zhí)行的私有SQL區(qū)域不共享,可能包含不同的值和數(shù)據(jù)。
游標(biāo)是特定私有SQL區(qū)的名稱(chēng)。如下圖所示,你可以將游標(biāo)看作是客戶端上的指針和服務(wù)器端的狀態(tài)。因?yàn)橛螛?biāo)與私有SQL區(qū)域密切相關(guān),所以術(shù)語(yǔ)有時(shí)可以相互互換使用。
一個(gè)私有SQL區(qū)可以劃分為如下幾個(gè)區(qū)域:
·The run-time area(運(yùn)行時(shí)區(qū))
這個(gè)區(qū)域包含查詢執(zhí)行狀態(tài)信息。例如The run-time area可以跟蹤到目前為止在全表掃描中檢索到的行數(shù)信息。當(dāng)游標(biāo)執(zhí)行結(jié)束時(shí)The run-time area被釋放。
oracle創(chuàng)建The run-time area作為執(zhí)行請(qǐng)求的第一步。對(duì)于DML語(yǔ)句,當(dāng)SQL語(yǔ)句關(guān)閉時(shí),The run-time area將會(huì)被釋放。
·The persistent area(持續(xù)數(shù)據(jù)區(qū))
這個(gè)區(qū)域包含綁定變量值。當(dāng)語(yǔ)句執(zhí)行時(shí)會(huì)提供一個(gè)綁定變量值到SQL語(yǔ)句。只有當(dāng)游標(biāo)關(guān)閉時(shí) The persistent area 才會(huì)被釋放。
客戶端進(jìn)程負(fù)責(zé)管理私有SQL區(qū)。盡管客戶端進(jìn)程可以分配的私有SQL區(qū)的數(shù)量受到初始化參數(shù)“OPEN_CURSORS”
的限制,但是私有SQL區(qū)的分配很大程度上還是取決于應(yīng)用程序。
盡管大多數(shù)用戶依賴(lài)于數(shù)據(jù)庫(kù)實(shí)用程序的自動(dòng)游標(biāo)處理,但Oracle數(shù)據(jù)庫(kù)編程接口提供給了開(kāi)發(fā)人員更多的控制游標(biāo)。一般來(lái)說(shuō),應(yīng)用程序應(yīng)該關(guān)閉所有不再被使用的開(kāi)放游標(biāo),以釋放持續(xù)數(shù)據(jù)區(qū),并最小化用戶所需的內(nèi)存。
SQL Work Areas(SQL工作區(qū))
工作區(qū)是用于內(nèi)存密集型操作的PGA內(nèi)存的私有區(qū)域。
例如,sort運(yùn)算符利用sort區(qū)域來(lái)將一行數(shù)據(jù)進(jìn)行排序。類(lèi)似的,一個(gè)散列連接操作符使用一個(gè)散列區(qū)域從它的左輸入構(gòu)建一個(gè)哈希表,而位圖合并使用位圖合并區(qū)域來(lái)合并從多個(gè)位圖索引掃描中檢索到的數(shù)據(jù)。
下圖顯示了員工和部門(mén)之間的查詢關(guān)系:
在前面的示例中,運(yùn)行時(shí)區(qū)跟蹤全表掃描的進(jìn)度。會(huì)話在散列區(qū)執(zhí)行散列連接以匹配兩個(gè)表中的行。排序則在排序區(qū)中進(jìn)行。
如果處理的數(shù)據(jù)量大于工作區(qū)的容量,那么oracle數(shù)據(jù)庫(kù)會(huì)將輸入的數(shù)據(jù)分成小塊。這樣的話數(shù)據(jù)庫(kù)就先會(huì)處理內(nèi)存中的數(shù)據(jù)片段,然后將其余的數(shù)據(jù)寫(xiě)入臨時(shí)磁盤(pán)以便稍后處理。
當(dāng)啟動(dòng)自動(dòng)PGA內(nèi)存管理時(shí),數(shù)據(jù)庫(kù)會(huì)自動(dòng)調(diào)整SQL工作區(qū)的大小,當(dāng)然,也可以手動(dòng)調(diào)整SQL工作區(qū)的大小。
一般來(lái)說(shuō),較大的SQL工作區(qū)是以高內(nèi)存消耗換取優(yōu)秀的操作性能。最理想的SQL工作區(qū)的大小是足以容納由其關(guān)聯(lián)的SQL操作符分配的輸入數(shù)據(jù)和輔助內(nèi)存結(jié)構(gòu)。否則響應(yīng)時(shí)間會(huì)增加,因?yàn)楸仨氁獙⒉糠州斎霐?shù)據(jù)緩存在磁盤(pán)上。在極端情況下,如果SQL工作區(qū)的容量遠(yuǎn)遠(yuǎn)小于輸入數(shù)據(jù)大小,那么數(shù)據(jù)庫(kù)必須對(duì)數(shù)據(jù)塊執(zhí)行多次傳遞,從而極大地增加響應(yīng)時(shí)間。
專(zhuān)用服務(wù)器和共享服務(wù)器模式下的PGA的使用
PGA內(nèi)存區(qū)的分配取決于數(shù)據(jù)庫(kù)采用的是專(zhuān)用服務(wù)器連接還是共享服務(wù)器連接。
下圖會(huì)體現(xiàn)出他們之間的不同: