Shared pool和PGA都是由一個(gè)Oracle的內(nèi)存管理器來(lái)管理,我們稱之為KGH heap manager。Heap Manager不是一個(gè)進(jìn)程,而是一串代碼。
由于shared pool中最重要的是library cache,所以本文主要講解Library cache的結(jié)構(gòu),library cache latch,library cache lock,library cache pin。
What is shared pool?
Shared pool是SGA中的一部分,由于它是SGA的一部分,這意味著它可以被所有的進(jìn)程所訪問(wèn),Shared Pool當(dāng)中主要包含了2部分:library cache和
dictionary cache 也稱為 row cache。
Library cache包含了共享SQL區(qū)(shared SQL areas),私有SQL區(qū)(private SQLareas,如果配置了共享服務(wù)器),PL/SQL存儲(chǔ)過(guò)程以及包,還有一些控制信息,比如說(shuō)locks以及l(fā)ibrary cache handles。
Dictionary cache包含了表,視圖的依賴信息,比如表結(jié)構(gòu),它的用戶,Oracle在解析SQL的時(shí)候就會(huì)頻繁的訪問(wèn)dictionary cache。
How is it managed?
Shared pool和PGA都是由一個(gè)Oracle的內(nèi)存管理器來(lái)管理,我們稱之為KGH heap manager。Heap Manager不是一個(gè)進(jìn)程,而是一串代碼。Heap Manager主要目的就是滿足server 進(jìn)程請(qǐng)求memory 的時(shí)候分配內(nèi)存或者釋放內(nèi)存。Heap Manager在管理PGA的時(shí)候,Heap Manager需要和操作系統(tǒng)來(lái)打交道來(lái)分配或者回收內(nèi)存。但是呢,在shared pool中,內(nèi)存是預(yù)先分配的,Heap Manager管理所有的空閑內(nèi)存。當(dāng)某個(gè)進(jìn)程需要分配shared pool的內(nèi)存的時(shí)候,Heap Manager就滿足該請(qǐng)求,Heap Manager也和其他ORACLE模塊一起工作來(lái)回收shared pool的空閑內(nèi)存。
Library Cache Manager
Library cache Manager 可以看做是Heap Manager的客戶端,因?yàn)閘ibrary cache manager是根據(jù)Heap Manager來(lái)分配內(nèi)存從而存放library cache objects。Library cache Manager控制所有的library cache object,包括package/procedure, cursor, trigger等等。
Hash Table and Hash Bucket
Library cache是由一個(gè)hash table組成,這個(gè)hash table又由hash bucket組成的數(shù)組構(gòu)成,每個(gè)hash bucket又是由一些相互指向的library cache handle所組成,library cache object handle就指向具體的library cache object以及一些引用列表。
Library Cache結(jié)構(gòu)示意圖如下:
Library Cache handle
我們對(duì)Library cache中所有對(duì)象的訪問(wèn)是通過(guò)利用library cache handle來(lái)實(shí)現(xiàn)的,也就是說(shuō)我們想要訪問(wèn)library cache object,我們必須先找到library cache handle。Library cache handle指向library cache object,它包含了library object的名字,命名空間,時(shí)間戳,引用列表,lock對(duì)象以及pin對(duì)象的列表信息等等。Library cache handle也被library cache用來(lái)記錄哪個(gè)用戶在這個(gè)這個(gè)handle上有l(wèi)ock,或者是哪個(gè)用戶正在等待獲得這個(gè)lock。那么這里我們也知道了library cache lock是發(fā)生在handle上的。
當(dāng)一個(gè)進(jìn)程請(qǐng)求library cache object, library cache manager就會(huì)應(yīng)用一個(gè)hash 算法,從而得到一個(gè)hash 值,根據(jù)相應(yīng)的hash值到相應(yīng)的hash bucket中去尋找。這里的hash算法原理與buffer cache中快速定位block的原理是一樣的。如果library cache object在內(nèi)存中,那么這個(gè)library cache handle就會(huì)被找到。有時(shí)候,當(dāng)shared pool不夠大,library cache handle會(huì)保留在內(nèi)存中,然而library cache heap由于內(nèi)存不足被age out,這個(gè)時(shí)候我們請(qǐng)求的object heap就會(huì)被重載。最壞的情況下,library cache handle在內(nèi)存中沒(méi)有找到,這個(gè)時(shí)候就必須分配一個(gè)新的library cache handle,同時(shí)object heap也會(huì)被加載到內(nèi)存中。
Library Cache Object
Library Cache Object是由一些獨(dú)立的heap所組成,,前面說(shuō)了Library cache handle指向Library cache Object,其實(shí)handle是指向第一個(gè)heap,這個(gè)heap 我們就稱之為heap 0。Heap 0記錄了指向其他heap的指針信息。
根據(jù)上面描述,Library cache中的的Library cache object結(jié)構(gòu)示意圖可以用上圖來(lái)表示(本圖摘自DSI405)
Library cache lock/pin
Library cache lock/pin是用來(lái)控制對(duì)library cache object的并發(fā)訪問(wèn)的。Lock管理并發(fā),pin管理一致性,lock是針對(duì)于library cache handle,而pin是針對(duì)于heap。
當(dāng)我們想要訪問(wèn)某個(gè)library cache object,我們首先要獲得這個(gè)指向這個(gè)object的handle的lock,獲得這個(gè)lock之后我們就需要pin住指向這個(gè)object的heap。
當(dāng)我們對(duì)包,存儲(chǔ)過(guò)程,函數(shù),視圖進(jìn)行編譯的時(shí)候,Oracle就會(huì)在這些對(duì)象的handle上面首先獲得一個(gè)library cache lock,然后再在這些對(duì)象的heap上獲得pin,這樣就能保證在編譯的時(shí)候其它進(jìn)程不會(huì)來(lái)更改這些對(duì)象的定義,或者將對(duì)象刪除。
當(dāng)一個(gè)session對(duì)SQL語(yǔ)句進(jìn)行硬解析的時(shí)候,這個(gè)session就必須獲得library cache lock,這樣其他session就不能夠訪問(wèn)或者更改這個(gè)SQL所引用的對(duì)象。如果這個(gè)等待事件花了很長(zhǎng)時(shí)間,通常表明共享池太小(由于共享池太小,需要搜索free的chunk,或者將某些可以被移出的object page out,這樣要花很長(zhǎng)時(shí)間),當(dāng)然了,也有可能另外的session正在對(duì)object進(jìn)行修改(比如split 分區(qū)),而當(dāng)前session需要引用那個(gè)table,那么這種情況下我們必須等另外的session進(jìn)行完畢。
Library Cache lock有3中模式:
的時(shí)候獲得
修改一個(gè)library cache object的時(shí)候獲得
用來(lái)確保對(duì)象依賴性
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com