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