PostgreSQL:邏輯結構

Ryan_Bai發表於2020-09-04

表空間

資料庫在邏輯上分成多個儲存單元,稱作表空間。表空間用作把邏輯上相關的結構放在一起。資料庫邏輯上是由一個或多個表空間組成。

  1. 邏輯關係存在表空間;

  2. 表空間存在對應的資料檔案中;
    新建立的資料庫對應的資料檔案的名稱:

    • Catalog表空間:存放系統表資訊 – databasename.dbf

    • System表空間:存放使用者資料 – Udatabasename.dbf

    • Temp表空間 – Tdatabasename.dbf

1. 前面加 “U” 字首代表使用者資料表空間,用於儲存使用者表的資料。
2. 不帶 U 代表 是系統表的表空間,用於儲存系統表的資料。
3. U 字首的資料檔案代表的表空間名為PG。
4. 不帶 U 的資料檔案代表的表空間為 CATALOG。

資料檔案結構

在 PostgreSQL 中,將儲存在磁碟中的塊稱為 Page,而將記憶體中的塊稱為 Buffer,表和索引稱為 Relation,行稱為 Tuple。資料的讀寫是以 Page 為最小單位,每個 Page 預設大小為 8k,在編譯 PostgreSQL 時指定的 BLCKSZ 大小決定 Page 的大小。每個表檔案由多個 BLCKSZ 位元組大小的 Page 組成,每個 Page 包含若干 Tuple。

Page

將資料檔案中的空間從邏輯上劃分成一個個頁面(資料塊)。頁面是資料庫I/O的基本單位,即只能整頁讀寫資料檔案, 頁面的大小預設是8K。

PageHeader

PageHeader 描述了一個資料頁的頁頭資訊,包含頁的一些元資訊。


  • pg_lsn:在 ARIES Recovery Algorithm 的解釋中,這個 lsn 稱為 PageLSN,它確定和記錄了最後更改此頁的 xlog 記錄的 LSN,把資料頁和 WAL 日誌關聯,用於恢復資料時校驗日誌檔案和資料檔案的一致性;pd_lsn 的高位為 xlogid,低位記錄偏移量;因為歷史的原因,64 位的 LSN 儲存為兩個 32 位的值。

  • pg_flags:標識頁面的資料儲存情況。

  • pd_special:指向索引相關資料的開始位置,該項在資料檔案中為空,主要是針對不同索引。

  • pd_lower:指向空閒空間的起始位置。

  • pd_upper:指向空閒空間的結束為止

  • pd_pagesize_version:不同的 PostgreSQL 版本的頁的格式可能會不同。

  • pd_linp[1]:行指標陣列,這些地址指向 Tuple 的儲存位置

如果一個表由一個只包含一個堆元組的頁面組成。該頁面的 pd_lower 指向第一行指標,並且行指標和 pd_upper 都指向第一個堆元組。當第二個元組被插入時,它被放置在第一個元組之後。第二行指標被壓入第一行,並指向第二個元組。pd_lower 更改為指向第二行指標,pd_upper 更改為第二個堆元組。此頁面中的其他頭資料也被重寫為適當的值

PageData

  • Data 段中,包含有: ItemIdData 段,Free Space段, Items段 以及Special space段。

    • ItemIdData 段: Array of (offset,length) pairs pointing to the actual items. 4 bytes per item.

    • Free Space 段:The unallocated space. New item pointers are allocated from the start of this area, new items from the end.

    • Items 段: The actual items themselves.

    • Special space 段: Index access method specific data. Different methods store different data. Empty in ordinary tables.

  • Item 的儲存是從 pg_upper 向 pg_lower(類似堆)方向增長。ItenIdData 的儲存是從 pg_lower 向 pg_upper 方向增長(類似棧)。

PageTuple

每個 Tuple 包含兩部分的內容,一部分為 HeapTupleHeader,用來儲存 Tuple 的元資訊,包含該 Tuple 的 OID、xmin、cmin 等;另一部分為 HeapTuple,用來儲存 Tuple 的資料。

Extent(區)

把資料檔案中 8 個連續的 Page 構成的空間稱為一個 Extent。Extent 是資料庫進行資料檔案空間分配/釋放的基本單位。每個表、索引、序列物件都是由若干個區組成。資料檔案被建立後,除自動保留部分割槽作為控制區外,其他區全部處於未分配狀態。表、索引、序列物件的所有資料都存放在 Extent 中,當向這些 Extent 中插入資料時,若該 Extent 的所有頁面都已佔滿,系統就會自動在所屬表空間的資料檔案中尋找一個尚未分配的區,並將其狀態修改為資料區。

控制頁面

  • 用於空間管理的控制頁面:PFS/GAM/IAM。

  • 用於增量備份的控制頁面:DCM。

  • 判斷可見性的控制頁面:VM。

  • 預留的控制頁面:BCM/SGAM。

PFS

Page Free Space,簡稱 PFS 頁.

  • 功能:用於記錄本資料檔案中頁面的空間使用情況。對檔案中的每個頁面,PFS中都有一個“位元組”與之對應,該位元組記錄了該頁面的狀態。

  • 每個頁面可能有三種狀態

    • RFS_FREE:該頁面已被物理分配,但尚未分配給任何資料物件或控制頁;

    • PFS_DATA:該物件被分配作為資料頁使用;

    • PFS_CTRL:該物件被分配作為控制頁使用;

  • PFS 頁前 64 bytes 被預留為頁頭, 剩下 81024 - 64 = 8128 一共覆蓋 81288 K = 64 MB 空間。故 PFS 頁每隔 8128 個頁面出現一次,系統初始化把第一個 PFS 頁放在資料檔案的第二個頁面位置,即:第1號資料頁面,由此可知,第 N 個 PFS 頁的位置在8128*N+1。

GAM

Global Allocation Map,簡稱 GAM 頁。

  • 功能:記錄所在資料檔案的 Extent 的分配情況,GAM 頁中除 GAM 頭外,剩下空間的每一位(bit)均對應一個 Extent 的分配情況。若某 bit 位為 1,則表明該 bit 位所關聯的 Extent 已被分配出去,反之未被分配。

  • 若一個 GAM 頁面大小為 8K,則除 GAM 頭(64 bytes)外,一個 GAM 頁面所能覆蓋的檔案範圍是:(81024-64)8(88K),約 4GB 空間。此外,GAM 頁每隔 881288 個頁面出現一個,系統要求第一個GAM 頁出現在檔案的第 3 個頁面位置(即:第 2 個索引位置),由此得知,第N個GAM 頁的出現位置是:881288*N+2

IAM

Index Allocation Map,簡稱 IAM 頁。

  • 功能:每個 IAM 頁只隸屬於一個資料庫物件(例如:表),但一個資料庫物件可包含多個 IAM 頁,由此可見 IAM 頁與資料庫物件的關係是 1 對 1,而資料庫物件與 IAM 頁的關係是 1 對多.

  • IAM 的結構與 GAM 頁類似,除 IAM 頭外,剩下空間的每一位 (bit) 均對應著一個與 IAM 相關的 Extent。若某 bit 位為 1,則表明該 bit 位所關聯的 Extent 已被分配給該 IAM,反之未被分配。若一個IAM頁面大小為 8K,則除 IAM 頭(64 bytes) 外,一個 IAM 頁面所能覆蓋的檔案範圍是: (81024-64)8(88K),約4 GB 空間。但與 GAM 也不同之處在於:IAM 的出現位置不固定,只在在建立資料庫物件的時候才分配。


該部落格由自己根據自身閱讀習慣,整理各方大神總結內容所得,如有冒犯,還望見諒,非常感謝!!!

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

相關文章