如何深度分析oraclebuffercache的概念以及內存結構

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

創(chuàng)新互聯建站于2013年成立,是專業(yè)互聯網技術服務公司,擁有項目成都網站設計、成都做網站、外貿網站建設網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元海東做網站,已為上家服務,為海東各地企業(yè)和個人服務,聯系電話:028-86922220


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

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

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

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

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

buffer cache就是使用多個hash bucket來治理的,其hash算法當然比我們前面列舉的要復雜多了。
從邏輯上說明了整個buffer cache的結構是怎么樣的。

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

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

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

關于如何深度分析oracle buffer cache的概念以及內存結構就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

本文名稱:如何深度分析oraclebuffercache的概念以及內存結構
新聞來源:http://muchs.cn/article46/ihishg.html

成都網站建設公司_創(chuàng)新互聯,為您提供用戶體驗虛擬主機、域名注冊、自適應網站App開發(fā)、網站維護

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

成都做網站