Chapter 7. 分页文件

一份描述数据库文件缺省页面格式的文档.

本章提供一个Postgres 的表所使用的页面格式的概述.用户定义的访问模式不需要使用这些页面格式.

在下面解释中,假定一个 字节 包含 8 个位.另外, 项(item) 指的是存储在 Postgres 表里的数据.

下面的表显示了普通的 Postgres 表和 Postgres 索引表 (例如,一个 B-tree 索引)里的页面是如何构造的.

Table 7-1. 样例页面布局

描述
itemPointerData(项指针数据)
filler(填充)
itemData...(项数据)
Unallocated Space(未分配空间)
ItemContinuationData(项连续数据)
Special Space(特殊空间)
``ItemData 2''
``ItemData 1''
ItemIdData(项标识数据)
PageHeaderData

每个页面的头8字节包含一个页面头(PageHeaderData). 在头里面,头三个2字节的整数域 (低(lower)高(upper), 和 特殊(special)) 分别代表相对于未分配空间开头的字节偏移量, 相对于未分配空间结尾的偏移量和相对于 special space(特殊空间)开头的偏移量. 特殊空间是位于页面尾部的空间, 这部分空间在页面初始化时分配并且包含某种访问模式的详细信息. 页面头的最后 2 字节, opaque,记录页面尺寸和页面内部的碎片信息. 页面尺寸存放在每个页面里是因为在一个表的缓冲池里面的帧可能会以 帧为单位分解成等尺寸的页面簇.内部碎片信息用于帮助决定何时进行页面的重新组合.

跟在页面头后面的是项标识 (ItemIdData). 新的项标识在未分配空间的头四个字节里分配. 因为在项标识被释放之前决不会移动,所以它做索引可以用于表示一个项在页面中的位置.实际上, Postgres 创建的每个项标识指针 (ItemPointer) 都由一个帧数和一个项标识索引组成.一个项标识包含一个到项开头的字节偏移量, 其长度以字节记,以及一套影响其转换 (interpretation)的属性位.

项本身是从未分配空间的尾部开始向前分配的空间中存储的. 通常,这些项不做转换.但是如果项太长而不能放在一个页面里或者需要 项某部分片段时,该项将被分解并且每一部分用下面的方法当作独立的项 处理.第一个到倒数第二个条目片段被放到一个条目连贯结构 (ItemContinuationData)里.这个结构包含 itemPointerData,该数据指向下一个片段和该片段本身.最后一个片段按通常方法操作.