PostgreSQL页面内部结构入门咨询:求易懂讲解及模拟工具
PostgreSQL 8KB页面内部结构通俗讲解
PostgreSQL里的所有数据(表、索引、日志等)都被拆成**固定8KB大小的"页面"**存储,你可以把每个页面想象成一个尺寸统一的文件抽屉——大小固定,内部有规整的分区,用来放不同类型的信息。下面用最直白的方式拆解表数据页的结构:
页面的核心组成模块
- 页面头部(Page Header):占约24字节的"抽屉标签区",记录页面的关键元信息:比如这是表数据页还是索引页、页内有多少条有效数据、最近修改它的事务ID、剩余空闲空间大小等。相当于抽屉上贴的标签,一眼能知道这个抽屉的基本情况。
- 元组指针数组(Item Pointer Array):页面里每条数据(PostgreSQL里叫"元组")的"目录索引",每个指针占4字节,指向元组在页内的具体位置,还标记了元组的状态(比如是否被删除)。就像抽屉里的目录条,告诉你第1条、第2条数据分别在抽屉的哪个角落。
- 空闲空间(Free Space):页面里未被占用的区域,新插入的元组会优先放到这里。就像抽屉里剩下的空位置,随着数据插入、删除,这块空间会动态变化。
- 元组数据区(Tuple Data):真正存储表数据的区域,每条元组不仅包含你插入的字段值,还附带自身的元信息(比如这条数据是哪个事务插入的、是否被更新过)。相当于抽屉里存放的实际文件。
简单理解数据查询的过程
当你执行SELECT * FROM 表 WHERE id=1;时,PostgreSQL会先定位到存储这条数据的页面,然后:
- 读页面头部确认这是目标表的有效数据页;
- 遍历元组指针数组,找到指向id=1的元组的指针;
- 根据指针位置,从元组数据区取出对应的完整数据返回给你。
实用的模拟/查看工具
- pg_pageinspect扩展:PostgreSQL官方自带的工具,能直接查看页面的原始结构。安装后可以用以下命令查看:
- 查看页面头部信息:
SELECT * FROM page_header(get_raw_page('你的测试表名', 0)); - 查看页内的元组和指针详情:
SELECT * FROM heap_page_items(get_raw_page('你的测试表名', 0));
你可以先建个小测试表(比如只插10条数据),用这些命令直观看到真实页面的各个部分,比单纯看文字好理解得多。
- 查看页面头部信息:
- 手动绘图模拟:拿一张纸画一个8KB的矩形(按比例的话,1KB=1024字节,8KB就是8192字节),然后把它分成页头、指针数组、空闲空间、元组区四个部分,手动标注每个部分的大小和内容——这种可视化的模拟能帮你快速建立页面结构的直观印象。
内容的提问来源于stack exchange,提问作者Malli
相关产品推荐
相关产品推荐

