数据页是pg中最小的IO单元,默认大小为8K。数据页小只能在编译安装的时候通过参数–with-blocksize=指定,一但编译完成后无法修改。
每个数据页都有一个编号,编号从0开始。

一个数据页由page header、tuple指针数组、free space、tuple、special space5部分组成。

页头
页头位于头部,有固定的大小,24bytes,用来存储关于页的大量信息,例如页校验码、其他部分大小等。
pd_lsn - identifies xlog record for last change to this page. pd_checksum - page checksum, if set. pd_flags - flag bits. pd_lower - offset to start of free space. pd_upper - offset to end of free space. pd_special - offset to start of special space. pd_pagesize_version - size in bytes and page layout version number. pd_prune_xid - oldest XID among potentially prunable tuples on page.
可以使用pageinspect插件查询页的各个部分大小。
mydb=# CREATE EXTENSION pageinspect;
mydb=# SELECT lower, upper, special, pagesize FROM page_header(get_raw_page('employees',0));
lower | upper | special | pagesize
-------+-------+---------+----------
560 | 576 | 8192 | 8192
tuple 指针数组
类似于页目录,用来定位页中的元组。pg使用6字节的tids来定位页中的具体的行。索引指向行的tid,tid指向了具体的行,tid由页号和具体的行地址组成。因为有些情况下行的位置会移动,导致位置变化,因此索引的指向也要跟着变化。通过指针间接引用后,即使位置发生了变化,tid保持不变,只需要修改指针的指向即可。
每个指针占用额外的4字节保存如下信息:
- 元组相对于页的起始位置的偏移量
- 元组的长度
- 几个位定义元组的状态
free space
页中空闲未被使用的空间
元组
存储实际的数据。由于MVCC的原因,一行可能存在多个版本,因此有多个元组。元组是从页的底部开始。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




