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