除哈希索引之外的每个堆和索引关系都有一个空闲空间映射
(FSM),用于跟踪关系中的可用空间。
它与主关系数据一起存储在一个单独的关系 fork 中,该 fork 以关系的
filenode 号加上 _fsm
后缀命名。例如,如果关系的 filenode 是 12345,
FSM 就存储在一个名为
12345_fsm 的文件中,与主关系文件位于同一目录。
空闲空间映射被组织成一棵 FSM 页面的树。最底层的 FSM 页面存储每个堆(或索引)页面上的可用空间,对每个 这样的页面使用一个字节来表示。上层从下层聚合信息。
每个 FSM 页面内部是一棵二叉树,存储在一个每个节点占 一个字节的数组中。每个叶节点代表一个堆页面,或一个更低层级的 FSM 页面。在每个非叶节点中,存储其子节点值中较高的 那个。因此叶节点中的最大值存储在根部。
关于 FSM 的结构以及它如何被更新和搜索的更多细节,
参见 src/backend/storage/freespace/README。
pg_freespacemap 模块
可用于检查存储在空闲空间映射中的信息。