PostgreSQL:邏輯結構
表空間
資料庫在邏輯上分成多個儲存單元,稱作表空間。表空間用作把邏輯上相關的結構放在一起。資料庫邏輯上是由一個或多個表空間組成。
-
邏輯關係存在表空間;
-
表空間存在對應的資料檔案中;
新建立的資料庫對應的資料檔案的名稱:
-
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle 邏輯結構Oracle
- 3:Oracle體系結構(邏輯結構)Oracle
- Oracle OCP(41):邏輯結構Oracle
- PostgreSQL 邏輯複製解密SQL解密
- PostgreSQL邏輯複製解密SQL解密
- PostgreSQL,SQLServer邏輯增量(通過邏輯標記update,delete)同步到Greenplum,PostgreSQLSQLServerdelete
- 物理結構和邏輯結構更通俗解釋
- 資料結構知識點--儲存結構與邏輯結構資料結構
- HBase學習之Hbase的邏輯結構和物理結構
- 檔案的邏輯結構、檔案目錄
- Vue原始碼探究-資料繫結邏輯架構Vue原始碼架構
- PostgreSQL邏輯複製資料同步到kafkaSQLKafka
- Go快速入門 03 | 控制結構:if、for、switch 邏輯語句Go
- postgresql從入門到精通教程 - 第36講:postgresql邏輯備份SQL
- PostgreSQL:程式結構SQL
- PostgreSQL:物理結構SQL
- 工作284:理解繫結邏輯
- 架構-穩定性建設邏輯問題實戰總結架構
- 從巢狀結構中取值時如何編寫兜底邏輯巢狀
- 240815-PostgreSQL自帶邏輯複製簡單使用SQL
- C-04.MySQL邏輯架構MySql架構
- 密碼找回邏輯漏洞總結密碼
- 線上支付邏輯漏洞總結
- PostgreSQL 目錄結構SQL
- 如何搭建文章結構——常見技術文章的邏輯框架框架
- 通過實驗理解PG邏輯結構:1 使用者(角色)
- 賽靈思(Xilinx)BlockRam(Bram)的結構與讀邏輯解釋BloC
- PostgreSQL邏輯備份pg_dump使用及其原理解析SQL
- 應用程式邏輯錯誤總結
- PostgreSQL:記憶體結構SQL記憶體
- PostgreSQL體系結構概述SQL
- 數字邏輯實踐6-> 從數字邏輯到計算機組成 | 邏輯元件總結與注意事項計算機元件
- 成為MySQL DBA後,再看ORACLE資料庫(六、邏輯儲存結構)MySqlOracle資料庫
- C++ 煉氣期之基本結構語法中的底層邏輯C++
- 達夢資料庫基礎知識(二)資料庫邏輯結構資料庫
- MySQL提升筆記(1):MySQL邏輯架構MySql筆記架構
- 資料庫 Mysql 邏輯架構簡介資料庫MySql架構
- 邏輯題