第 9 章 · 存储与物理结构 · 交互演示

本页面用 纯 HTML/CSS/JS,零依赖,离线可用。点按钮即可观察页布局、TOAST 切片、HOT 更新等核心机制。

① 8KB 页(Page)的物理布局

PageHeader 24B ItemId 4B/个 Free Space HeapTuple Special

观察要点

  • ItemId 从前往后增长:每个 4 字节,索引就是页内行号。
  • Tuple 从后往前增长:变长元组追加无需搬动既有数据。
  • Free Space = pd_upper - pd_lower,可瞬间计算。
  • 当 Free Space < 即将插入的 Tuple,则页满,PG 会向 FSM 申请下一页。
  • 真实页里 PageHeader 是固定 24B;为方便观察,可切换对齐模拟边界。

② TOAST 切片演示(超大字段如何外移)

  
阈值:单行 > ~2KB 触发;EXTENDED 先压缩再外移;EXTERNAL 不压缩仅外移; MAIN 仅压缩;PLAIN 完全不动(如果放不下会报错)。

③ fillfactor 与 HOT 更新对比

④ 一张表对应哪些物理文件

$PGDATA/base/16384/         (16384 = learn_pg 数据库的 OID)
├── 16400          ← orders 表的主数据 (relfilenode=16400)
├── 16400.1        ← 超过 1GB 的下一个 segment
├── 16400_fsm      ← Free Space Map
├── 16400_vm       ← Visibility Map
├── 16401          ← orders_pkey 索引
├── 16402          ← pg_toast.pg_toast_16400 (TOAST 主表)
├── 16403          ← pg_toast_16400_index (TOAST 索引)
└── ...

SELECT pg_relation_filepath('orders') 即可查询任意表的文件路径。