暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Postgresql逻辑结构之数据页(五)

原创  江湖小虾米  2024-01-21
271

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

page_layout.png

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

page.png

页头
页头位于头部,有固定的大小,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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论