当前位置: 首页 > news >正文

DeepSeek总结PostgreSQL存储体系的核心单元——8KB大小的数据页

原文地址:https://boringsql.com/posts/inside-the-8kb-page/

文章解释了为什么是8KB、页的内部结构布局,以及这些结构如何影响数据库的I/O、并发控制和清理机制。

一、为什么是8KB?

  • 历史渊源:源自1980年代的伯克利POSTGRES项目,当时选择8KB是为了匹配Unix系统的虚拟内存页(4KB/8KB)和磁盘扇区(512字节),实现高效对齐。
  • 现代权衡:8KB是OLTP场景下的平衡点——太小会导致元数据开销占比过高;太大会造成空间浪费和单次I/O读取过多无用数据(如只读一行也要加载整个大块)。
  • 对比:分析型数据库(如DuckDB)使用更大的块(如256KB)以提升顺序扫描吞吐量。
  • 灵活性:PostgreSQL支持在编译时通过--with-blocksize调整为1/2/4/8/16/32KB,但默认8KB适用于绝大多数场景。

二、页的内部结构(Slotted Page 布局)

页采用“槽页”布局,数据从两端向中间填充,中间留出空闲空间:

  1. 页头(Page Header,24字节)

    • pd_lsn(8字节):最后修改该页的WAL日志序号,用于崩溃恢复。
    • pd_checksum(2字节):页数据校验和(需启用)。
    • pd_flags(2字节):页状态标志,如PD_ALL_VISIBLE(页内所有行对所有事务可见,是实现仅索引扫描的关键)。
    • pd_lower(2字节):行指针数组的结束偏移量(指向空闲空间起点)。
    • pd_upper(2字节):元组数据的开始偏移量(指向空闲空间终点)。
    • pd_special(2字节):特殊空间起始位置(堆页为8192,即无特殊空间;索引页用于存储B-Tree元数据)。
    • pd_pagesize_version(2字节):页大小与版本。
    • pd_prune_xid(4字节):用于页级剪枝,允许查询在访问时就地清理死元组,避免等待VACUUM。
  2. 行指针(Line Pointer,4字节/个)

    • 紧接页头向下增长,相当于页的“目录”。
    • 结构:lp_off(元组偏移量)、lp_flags(状态:未使用/正常/重定向/死亡)、lp_len(元组长度)。
    • 作用:索引指向的是(页号,行指针序号)ctid,而非物理偏移。这使得页内碎片整理或HOT更新可以移动元组,而索引无需变更。
  3. 空闲空间:位于pd_lowerpd_upper之间的区域。

  4. 元组数据:从页底向上增长,包含元组头(23字节)+ 对齐填充 + 实际列数据。

三、关键机制与观察

  • 容量估算
    • 每行开销 ≈ 4字节行指针 + 23字节元组头(通常对齐到24字节)+ 实际数据。
    • 示例表中,平均每行约76字节,单页可容纳约110-120行。
  • 多页扩展
    • 当数据超过单页容量,PostgreSQL分配新页(relpages增长)。
    • 通过pageinspect可以查看每一页的填充情况(如第一页只剩52字节空闲,第二页只剩8字节)。
  • 索引页的特殊空间
    • 堆页的pd_special=8192(无特殊空间)。
    • B-Tree索引页使用最后16字节存储兄弟页指针、树层级等元数据。

四、使用pageinspect进行内部观察

文章演示了如何通过pageinspect扩展直接查看页的原始内容:

  • page_header(get_raw_page('表', 0)):解析页头信息(LSN、lower/upper、特殊空间等)。
  • heap_page_items(get_raw_page('表', 0)):列出页内所有行指针及对应元组长度、状态。
  • bt_page_stats('索引', 1):查看索引页的统计信息(类型、活动项、空闲大小等)。

五、总结:页是I/O的原子单元

  • 读一行= 加载整个8KB页到缓冲区。
  • 写一标志= 重写整个页(并记录WAL)。
  • 可见性优化PD_ALL_VISIBLE标志使仅索引扫描得以跳过堆检查。
  • 轻量清理pd_prune_xid允许普通查询在访问页时触发页级剪枝,回收空间。
  • 布局优势:Slotted Page设计将固定大小的行指针与可变大小的元数据分离,减少碎片,便于管理。
http://www.jsqmd.com/news/418102/

相关文章:

  • SQL Server删除正在恢复数据库方法
  • 2026年中医就诊能用医保吗?使用条件及报销要点 - 品牌排行榜
  • 2026年操作简单使用方便且安全的染发膏推荐 - 品牌排行榜
  • CLI Test Post Angular - 智造出海
  • 2026年固生堂工作怎么样?内部视角解析职业发展与环境 - 品牌排行榜
  • Bitwarden+cpolar 让密码管理随时随地更安心
  • 2026广东最新沉香手串供应链优选指南 十大品质生产厂家参考 - 十大品牌榜
  • 2026执业药师备考指南:基础薄弱考生专属的三大靠谱网课推荐! - 医考机构品牌测评专家
  • 2026 执业医师题库哪个真题多?高口碑真题库真心推荐,速收藏! - 医考机构品牌测评专家
  • 2026成分安全的国货染发品牌选哪个?5大品牌真实测评 - 品牌排行榜
  • 备考2026执业药师考试机构怎么选?高口碑实力之选大公开! - 医考机构品牌测评专家
  • 跨境卖家如何用星拓广告系统重建Q1关键词策略 - 博客湾
  • 快造Snapmaker下一款3D打印机也是多头?
  • AI 岗位全景与转行指南:从技能到 Offer
  • 2026不沾头皮且不伤头发操作简单的染发膏推荐 - 品牌排行榜
  • 2026外壳尼龙吸湿增湿箱多少钱?如何选择性价比高的供应商 - 品牌推荐大师
  • Python 多线程
  • 2026年不沾头皮,不容易掉色且不伤头发的染发膏推荐 - 品牌排行榜
  • CentOS Stream 9服务器Docker部署KWDB:从零到跨模查询实战全记录
  • 中西医执医课程如何选择?一位过来人的真实经验分享 - 医考机构品牌测评专家
  • 2026 年主流医考 APP 综合对比与优选推荐 - 医考机构品牌测评专家
  • RETLLM Training and Data-Free MLLMs for Multimodal Information Retrieval
  • 中医执医考试哪个机构课程好 - 医考机构品牌测评专家
  • 宝妈如何高效备考主管护师?全方位备考攻略 - 医考机构品牌测评专家
  • Exploring Multimodal LMMs for Online Episodic Memory Question Answering on the Edge
  • 设计师素材网站推荐2026版:十大美工素材网站及运营设计素材网站盘点 - 品牌2026
  • 家庭聚餐选什么酒排行榜,真实口碑款家用聚餐酒完整整理 - 资讯焦点
  • 主治医师考试备考攻略:如何挑选真正靠谱的网课? - 医考机构品牌测评专家
  • Tita小技巧:企业统一管控任务更新填写,让信息填写不缺位!
  • 全场景节日送礼酒水推荐:选酒指南 + 2026 高适配好礼榜单 - 资讯焦点