pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
摘要
对数据库文件默认页格式的描述。
本节概述 Postgres 类使用的页格式。用户 定义的访问方法不必使用这种页格式。
在下面的说明中,假定一个 字节(byte) 包含 8 位。此外,术语 项(item) 指存储在 Postgres 类中的数据。
下表展示了普通 Postgres 类和 Postgres 索引 类(例如 B-tree 索引)中的页面是如何组织的。
表 63.1. 页面布局示例
| 项 | 描述 |
|---|---|
| itemPointerData | |
| filler | |
| itemData... | |
| 未分配空间 | |
| ItemContinuationData | |
| 特殊空间 | |
| "ItemData 2" | |
| "ItemData 1" | |
| ItemIdData | |
| PageHeaderData |
每个页面的前 8 个字节由页头 (PageHeaderData)组成。 在页头中,前三个 2 字节整数字段 (lower、 upper 和 special) 分别表示到未分配空间开始处、到未分配空间 结束处以及到特殊空间开始处的字节偏移。 特殊空间是页面末尾的一个区域,它在页面初始化时 分配,并包含某种访问方法特有的信息。页头的最后 2 个字节 opaque 编码页面大小和页面内部碎片的信息。 每个页面都存储页面大小,因为缓冲池中的帧 在一个类内可以逐帧细分为大小相等的页面。内部 碎片信息用来帮助确定何时应进行页面 重组。
页头之后是项标识符 (ItemIdData)。 新的项标识符从未分配空间的前四个字节分配。 由于项标识符在被释放之前从不移动,其索引可用来 指示一个项在页面上的位置。事实上, Postgres 创建的每个指向项的 指针(ItemPointer) 都由一个帧号和一个项标识符的索引组成。 项标识符包含到项开始处的字节偏移、以字节为单位的 长度以及一组影响其解释的属性位。
项本身存储在从未分配空间末尾向后分配的空间中。通常 不对项进行解释。但当项太长而无法放在单个页面上或 希望对项进行分片时,项会被切分, 每一片按下述方式作为不同的项处理。第一片到 倒数第二片放在项延续结构 (ItemContinuationData) 中。该结构包含指向下一片的 itemPointerData 和这一片本身。最后一片按正常方式处理。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。