PostgreSQL中page頁結構

jesselyu發表於2015-01-01

PostgreSQL中page頁結構原始碼解析


    在PG中,磁碟儲存和記憶體中的最小管理單位都是page,也是通常所說的block。一般PG頁的大小為8K,在原始碼編譯時可以設定。此後都不可更改,因為許多PG記憶體結構設計都是以此為基礎的。

在一個page中,表的記錄是從page的底部開始儲存,然後慢慢向上漲。Page結構圖如下:


    上圖為一個page的結構,主要由5個部分組成:

    Page Header:為頁頭,主要儲存LSN,page中空閒空間的開始offset和結束offset等。下面再展開講。

    ItemId data:是page中表記錄的索引條目。一個索引條目4個位元組,由兩部分組成:此記錄在page中的offset和記錄長度length。

    Free space:是此page中剩餘可用的空間,不算標記為delete後的空間;是指完全沒有被使用的空間,也相當於page中沒有被分配的空間。

    Item:就是指表實際儲存的記錄。

    Special space: 儲存索引訪問方法(AM: Access Method)資訊,不同的索引訪問方法,內容不一樣。但如果是表的page,那麼這裡是空的,沒有任何資訊。

    

原始碼在src/backend/storage/page/bufpage.c中,以下為Page的初始化:




Page header 24個位元組說明如下:

PageHeader 原始碼定義如下:

其中,PageXLogRecPtr為一個結構體,64位。記錄xlog資訊的原因:

  1. 保證buffer manger WAL原則,即寫日誌先於寫資料

  2. 髒塊checkpoint時,日誌先刷出到disk


總的來講,PG中頁的結構大體上Oracle的Block結構是比較類似的,都是採用向上漲的方式來儲存記錄。但是在小細節上還是分別比較大的。Oracle的Block中還有ITL等事務相關資訊等。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30088583/viewspace-1387177/,如需轉載,請註明出處,否則將追究法律責任。

相關文章