深入理解DB2緩衝池(BufferPool)

2021-07-25 16:16:37 字數 2292 閱讀 1374

無論是cpu晶元,作業系統還是web伺服器等方方面面,都會使用乙個非常重要的技術:快取。cpu和記憶體之間的快取記憶體,記憶體和外設之間的系統快取,區域網與外部網路之間的web快取伺服器。。。這些「快取」的具體實現方式各不相同,但原理和目的都是一樣的:在高速裝置上預存資料以期直接通過高速裝置完成讀寫而避免低速裝置上的資料傳輸,從而提高系統效能。

緩衝池(bufferpool)

對於資料庫管這種對效能要求極高的系統而言,快取自然也是不可少的。資料庫中的快取稱為緩衝池,緩衝池存在的唯一目的就是提高資料庫系統效能。

緩衝池本質上是分配給資料庫管理器管理的一塊記憶體空間,用於讀寫資料頁。(包括錶行和索引資料頁。記憶體中表行資料頁稱為快取表)由於從記憶體訪問資料比從磁碟訪問資料快得多(訪問磁碟是典型的i/o操作,一次i/o大概耗時0.0125s),通過將部分常用或者需要預取的資料存放在緩衝池以便系統直接訪問和操作可以減少磁碟i/o,合理的緩衝池空間和好的緩衝池頁面替換演算法(提高命中率)可以大大提高資料庫系統的效能。

注意分配給db2的記憶體空間不僅僅是緩衝池,還包括包快取空間,日誌快取空間等等一些其他的記憶體空間,其中緩衝池佔了db2記憶體的大部分。

建立資料庫時,會建立乙個名為 ibmdefaultbp 的預設緩衝池,所有的表空間都共享該緩衝池。可以使用 create bufferpool 語句新增更多的緩衝池。緩衝池的預設大小是 buffpage 資料庫配置引數所指定的大小,但是可以通過在 create bufferpool 命令中指定 size 關鍵字來覆蓋該預設值。足夠的緩衝池大小是資料庫擁有良好效能的關鍵所在,因為它可以減少磁碟 i/o 這一最耗時的操作。大型緩衝池還會對查詢優化產生影響,因為更多的工作可在記憶體中完成。

緩衝池大概實現

db2緩衝池的結構和具體實現是非常複雜的,只知道乙個大概的實現過程,其實也跟作業系統快取差不多。

首次訪問資料庫表中的資料行時,由於緩衝池內沒有資料頁,資料庫管理器會將磁碟上相應的資料頁讀入緩衝池中,每當向緩衝池新增新頁時,都會為該頁生成乙個頁面描述符(bpd)以標識該頁並指明該頁狀態,描述符被存放在database heap中,刪除頁時會將其描述符一併刪除,頁面狀態發生變化後會更新該頁描述符。

對緩衝池中資料頁進行操作時會根據操作型別為資料新增乙個共享鎖或排它鎖以保證資料的同步,新增的鎖被存放在locklist中統一管理。同時將操作的sql語句儲存到包快取(package cache)中,根據包快取的資料在日誌緩衝區(log cache)中生成日誌檔案。當操作提交時,如果資料頁沒有被修改(乾淨頁),則無需向磁碟回寫資料頁,如果資料頁被修改(髒頁),則需要將修改後的資料頁回寫到磁碟,替換原有頁,,該髒頁變成乾淨頁。同時立即將相應的日誌檔案寫入磁碟,以保證發生斷電等突發事故時保證能夠利用磁碟上的日誌檔案進行回滾(undo)或重做(redo)。【未提交確認的修改會回滾,已提交確認的修改會重做】

操作提交後,資料頁所持有的共享鎖或排它鎖也相應解除。所有這些資料頁在操作提交後都會繼續保留在緩衝池中。當下次進行訪問時,如果緩衝池中存在需要訪問的資料頁(命中),則直接對該頁進行操作,並同樣進行日誌記錄和資料頁回寫等操作。如果緩衝池中不存在需要訪問的資料頁(未命中),則需要先從磁碟將資料頁讀入緩衝池,重複以上過程。

如果需要將新的資料頁從磁碟讀入緩衝池,而緩衝池正好已經滿了該怎麼辦呢?這個時候就要根據頁面替換演算法,選擇將某些頁從緩衝池刪除以容納新頁。頁面替換演算法有很多種,db2使用的是一種類似於最近最少使用(lru)演算法的時鐘演算法。

緩衝池和表空間的關係

乙個緩衝池是與單個資料庫相關聯的,可以被多個表空間使用。乙個資料庫可以有多個緩衝池。資料庫建立時會生成乙個名為ibmdefaultbp的預設緩衝池。當考慮將緩衝池用於乙個或多個表空間時,必須保證表空間頁大小和緩衝池頁大小對於緩衝池所「服務」的所有表空間而言都是一樣的(和表空間一樣,緩衝池中的頁大小也分為4kb,8kb,16kb和32kb四種)。乙個表空間只能使用乙個緩衝池。如圖:

基於塊的緩衝池

db2允許留出緩衝池的一部分(最高98%)用於基於塊的預取操作(塊預取:如果多個同區段的頁面由於某個單個請求而被讀取,就會發生塊讀取),基於塊的i/o可以通過將塊(多個頁面)讀入相鄰的記憶體區而不是將它們分散裝入單獨的頁來提高預取操作的效率。每個緩衝池的塊大小必須相同,並且有blocksize引數控制,該值等於塊的大小(頁數),取值範圍為2-256。預設為32。

有幾篇棒子文**貌似很好,記在這:

DB2的緩衝池 BUFFERPOOL

db2資料庫在執行時會占用不少的系統記憶體。db2按三個級別來管理記憶體 由oss元件向其他元件提供 記憶體集 記憶體池和記憶體塊。記憶體塊組成記憶體池。記憶體池屬於乙個記憶體集。記憶體集裡有多個記憶體池。緩衝池 bufferpool 就其中的一種記憶體池,這型別記憶體池消耗的記憶體數量最大。buf...

db2 的緩衝池設計

最近接到一些朋友的信,問一些關於緩衝區管理的問題。俺想藉此機會也寫個短篇總結一下 什麼是緩衝區管理 很多使用者可能都有疑問,緩衝區是不是越大越好,是乙個單獨的大緩衝池好還是若干個稍小的緩衝池好。總地來說,這個問題沒有乙個標準答案。在俺的經驗中,緩衝區管理可以歸納為兩個字 質,量 緩衝池的作用是把資料...

DB2緩衝池 表空間

在db2中建立表空間得指向該錶空間所屬緩衝池,否則表空間指向預設緩衝池 1.緩衝池 1.1 建立緩衝池 語法 create bufferpool size pagesize 例項 create bufferpool oliver buffer immediate size 250 pagesize ...