Database Page Layout
本节概述 PostgreSQL 表和索引内部所使用的页面格式。 [19] 序列和 TOAST 表的格式与普通表相同。 在下面的说明中,假定一个 字节 包含 8 个位。另外,术语 项 指的是存储在页面上的单个数据值。在表中,项是一行;在索引中,项是一条索引条目。 每个表和索引都存储为固定大小的 页面 数组(通常为 8 kB,不过在编译服务器时可以选择不同的页面大小)。在表中,所有页面在逻辑上都是等价的,因此某个特定项(行)可以存放在任意页面中。在索引中,第一页通常保留为 元页 ,用于保存控制信息…
当前查看 PostgreSQL 18。
中文定义与说明
存储结构 storage-page-layout。
同版本中文手册节选
本节概述 PostgreSQL 表和索引内部所使用的页面格式。[19] 序列和 TOAST 表的格式与普通表相同。
在下面的说明中,假定一个字节包含 8 个位。另外,术语项指的是存储在页面上的单个数据值。在表中,项是一行;在索引中,项是一条索引条目。
每个表和索引都存储为固定大小的页面数组(通常为 8 kB,不过在编译服务器时可以选择不同的页面大小)。在表中,所有页面在逻辑上都是等价的,因此某个特定项(行)可以存放在任意页面中。在索引中,第一页通常保留为元页,用于保存控制信息;并且根据索引访问方法的不同,索引中还可能存在不同类型的页面。
表 66.2 展示了页面的总体布局。每个页面包含五个部分。
说明
本节概述 PostgreSQL 表和索引内部所使用的页面格式。 [19] 序列和 TOAST 表的格式与普通表相同。 在下面的说明中,假定一个 字节 包含 8 个位。另外,术语 项 指的是存储在页面上的单个数据值。在表中,项是一行;在索引中,项是一条索引条目。 每个表和索引都存储为固定大小的 页面 数组(通常为 8 kB,不过在编译服务器时可以选择不同的页面大小)。在表中,所有页面在逻辑上都是等价的,因此某个特定项(行)可以存放在任意页面中。在索引中,第一页通常保留为 元页 ,用于保存控制信息;并且根据索引访问方法的不同,索引中还可能存在不同类型的页面。 表 66.2 展示了页面的总体布局。每个页面包含五个部分。
- 定义范围
- 同版本核心物理存储文档
页大小在编译时确定。特殊空间由访问方法决定,普通堆表页面不使用该区域。偏移与对齐规则以所选版本的手册定义为准。
页面总体布局
| 项目 | 说明 |
|---|---|
| PageHeaderData | 长 24 字节,包含页面的通用信息,例如空闲空间指针。 |
| ItemIdData | 指向实际数据项的行指针数组。每项为一个(偏移,长度)对,占 4 字节。 |
| 空闲空间 | 尚未分配的空间。新行指针从该区域的起始处分配,新数据项从末尾处分配。 |
| 项 | 实际的数据项本身。 |
| 特殊空间 | 索引访问方法专用数据。不同方法存储的内容不同,普通表中此区域为空。 |
PageHeaderData 布局
| 字段 | 类型 | 长度 | 说明 |
|---|---|---|---|
| pd_lsn | PageXLogRecPtr | 8 字节 | LSN:该页最后一次变化所对应 WAL 记录的最后一个字节之后的位置。 |
| pd_checksum | uint16 | 2 字节 | 页面校验和 |
| pd_flags | uint16 | 2 字节 | 标志位 |
| pd_lower | LocationIndex | 2 字节 | 空闲空间起始位置的偏移量 |
| pd_upper | LocationIndex | 2 字节 | 空闲空间结束位置的偏移量 |
| pd_special | LocationIndex | 2 字节 | 特殊空间起始位置的偏移量 |
| pd_pagesize_version | uint16 | 2 字节 | 页面大小与布局版本号信息 |
| pd_prune_xid | TransactionId | 4 字节 | 页面上最早的尚未修剪的 XMAX;没有则为零 |
HeapTupleHeaderData 布局
| 字段 | 类型 | 长度 | 说明 |
|---|---|---|---|
| t_xmin | TransactionId | 4 字节 | 插入事务的 XID |
| t_xmax | TransactionId | 4 字节 | 删除事务的 XID |
| t_cid | CommandId | 4 字节 | 插入和/或删除命令的 CID,与 t_xvac 共用存储位置 |
| t_xvac | TransactionId | 4 字节 | VACUUM 操作移动行版本时使用的 XID |
| t_ctid | ItemPointerData | 6 字节 | 本行版本或较新行版本的当前 TID |
| t_infomask2 | uint16 | 2 字节 | 属性数量及各种标志位 |
| t_infomask | uint16 | 2 字节 | 各种标志位 |
| t_hoff | uint8 | 1 字节 | 用户数据的偏移量 |
相关条目
文档与源码
来源构建
- 版本
- 18.6
- 构建
- https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2
- 来源指纹
555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f
版本比较
PostgreSQL 17 → 18: 无变化。
比较已记录的接口与属性,排除来源指纹和构建元数据。某个样本中没有记录,不能据此判断实际引入或移除的版本。
相关条目
导出 JSON · 返回存储结构 · 收录范围为 PostgreSQL 10 至 20;最早采样版本不一定是实际引入版本。