溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何深度分析oracle buffer cache的概念以及內(nèi)存結(jié)構(gòu)

發(fā)布時(shí)間:2021-12-30 11:52:27 來源:億速云 閱讀:95 作者:柒染 欄目:云計(jì)算

這篇文章給大家介紹如何深度分析oracle buffer cache的概念以及內(nèi)存結(jié)構(gòu),內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。


1.buffer cache的概念
用最簡(jiǎn)單的語言來描述oracle數(shù)據(jù)庫(kù)的本質(zhì),其實(shí)就是能夠用磁盤上的一堆文件來存儲(chǔ)數(shù)據(jù),并提供了各種各樣的手段對(duì)這些數(shù)據(jù)進(jìn)行治理。作為治理數(shù)據(jù)的最基本要求就是能夠保存和讀取磁盤上的文件中的數(shù)據(jù)。眾所周知,讀取磁盤的速度相對(duì)來說是非常慢的,而內(nèi)存相對(duì)速度則要快的多。因此為了能夠加快處理數(shù)據(jù)的速度,oracle必須將讀取過的數(shù)據(jù)緩存在內(nèi)存里。而oracle對(duì)這些緩存在內(nèi)存里的數(shù)據(jù)起了個(gè)名字:數(shù)據(jù)高速緩存區(qū)(db buffer cache),通常就叫做buffer cache。按照oracle官方的說法,buffer cache就是一塊含有許多數(shù)據(jù)塊的內(nèi)存區(qū)域,而這些數(shù)據(jù)塊主要都是數(shù)據(jù)文件里的數(shù)據(jù)塊內(nèi)容的拷貝。通過初始化參數(shù):buffer_cache_size來指定buffer cache的大小。oracle實(shí)例一旦啟動(dòng),該區(qū)域大小就被分配好了。

buffer cache所能提供的功能主要包括:
1)通過緩存數(shù)據(jù)塊,從而減少I/O。
2)通過構(gòu)造CR塊,從而提供讀一致×××。
3)通過提供各種lock、latch機(jī)制,從而提供多個(gè)進(jìn)程并發(fā)訪問同一個(gè)數(shù)據(jù)塊的功能。
2.buffer cache的內(nèi)存結(jié)構(gòu)

2.1 buffer cache概述
oracle內(nèi)部在實(shí)現(xiàn)其治理的過程中,有兩個(gè)非常有名的名詞:鏈表和hash算法。
鏈表是一種數(shù)據(jù)結(jié)構(gòu),通過將對(duì)象串連在一起,從而構(gòu)成鏈表結(jié)構(gòu)。這樣,假如要修改、刪除、查找某個(gè)對(duì)象的話,都可以先到鏈表中去查找,而不必實(shí)際的訪問物理介質(zhì)。oracle中最有名的鏈表大概就是LRU鏈表了,我們后面會(huì)介紹它。

而hash算法則是為了能夠進(jìn)行快速查找定位所使用一種技術(shù)。所謂hash算法,就是根據(jù)要查找的值,對(duì)該值進(jìn)行一定的hash算法后得出該值所在的索引號(hào),然后進(jìn)入到該值應(yīng)該存在的一列數(shù)值列表(可以理解為一個(gè)二維數(shù)組)里,通過該索引號(hào)去找它應(yīng)該屬于哪一個(gè)列表。然后再進(jìn)入所確定的列表里,對(duì)其中所含有的值,進(jìn)行一個(gè)一個(gè)的比較,從而找到該值。這樣就避免了對(duì)整個(gè)數(shù)值列表進(jìn)行掃描才能找到該值,這種全掃描的方式顯然要比hash查找方式低效很多。其中,每個(gè)索引號(hào)對(duì)應(yīng)的數(shù)值列在oracle里都叫做一個(gè)hash bucket。

我們來列舉一個(gè)最簡(jiǎn)單的hash算法。假設(shè)我們的數(shù)值列表最多可以有10個(gè)元素,也就是有10個(gè)hash buckets,每個(gè)元素最多可以包含20個(gè)數(shù)值。則對(duì)應(yīng)的二維數(shù)組就是t[10][20]。我們可以定義hash算法為n MOD 10。通過這種算法,可以將所有進(jìn)入的數(shù)據(jù)均勻放在10個(gè)hash bucket里面,hash bucket編號(hào)從0到9。比如,我們把1到100都通過這個(gè)hash函數(shù)均勻放到這10個(gè)hash bucket里,當(dāng)查找32在哪里時(shí),只要將32 MOD 10等于2,這樣就知道可以到2號(hào)hash bucket里去找,也就是到t[2][20]里去找,2號(hào)hash bucket里有10個(gè)數(shù)值,逐個(gè)比較2號(hào)hash bucket里是否存在32就可以了。

buffer cache就是使用多個(gè)hash bucket來治理的,其hash算法當(dāng)然比我們前面列舉的要復(fù)雜多了。
從邏輯上說明了整個(gè)buffer cache的結(jié)構(gòu)是怎么樣的。

列出三個(gè)名詞:hash bucket、buffer header和hash chain。
這里的hash bucket就是我們前面說明hash算法中提到的二維數(shù)組的第一維。它是通過對(duì)buffer header
里記錄的數(shù)據(jù)塊地址和數(shù)據(jù)塊類型運(yùn)用hash算法以后,得到的組號(hào)。
這里的hash chain就是屬于同一個(gè)hash bucket的所有buffer header所串起來的鏈表。實(shí)際上,hash
bucket只是一個(gè)邏輯上的概念。每個(gè)hash bucket都是通過不同的hash chain而體現(xiàn)出來的。每個(gè)hash chain都會(huì)由一個(gè)cache buffers chains latch來治理其并發(fā)操作。

而對(duì)于buffer header來說,每一個(gè)數(shù)據(jù)塊在被讀入buffer cache時(shí),都會(huì)先在buffer cache中構(gòu)造一個(gè)buffer header,buffer header與數(shù)據(jù)塊一一對(duì)應(yīng)。buffer header包含的主要信息有:
1)該數(shù)據(jù)塊在buffer cache中實(shí)際的內(nèi)存地址。就是上圖中的虛線箭頭所表示的意思。
2)該數(shù)據(jù)塊的類型,包括data、segment header、undo header、undo block等等。
3)該buffer header所在的hash chain,是通過在buffer header里保存指向前一個(gè)buffer header的指針和指向后一個(gè)buffer header的指針的方式實(shí)現(xiàn)的。
4)該buffer header所在的LRU、LRUW、CKPTQ等鏈表(這些鏈表我們后面都會(huì)具體說明)。也是通過記錄前后buffer header指針的方式實(shí)現(xiàn)。
5)當(dāng)前該buffer header所對(duì)應(yīng)的數(shù)據(jù)塊的狀態(tài)以及標(biāo)記。
6)該buffer header被訪問(touch)的次數(shù)。
7)正在等待該buffer header的進(jìn)程列表(waiter list)和正在使用該buffer header的進(jìn)程列表(user list)。

buffer cache中,缺省的hash bucket的數(shù)量或者說缺省有多少條hash chain鏈表,是由一個(gè)隱藏參數(shù):
_db_block_hash_buckets決定的。置于該參數(shù)的取值,在我的測(cè)試中,8i下,該參數(shù)缺省為db_block_buffers×2;但是到了9i以后,該參數(shù)似乎取的是小于且最接近于db_block_buffers×2的素?cái)?shù)。

關(guān)于如何深度分析oracle buffer cache的概念以及內(nèi)存結(jié)構(gòu)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI