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

postgresql数据文件结构

原创 pg 2022-07-08
1103

一、数据文件结构 -

在 PG 中,磁盘存储和内存中的最小管理单位都是块,保存在磁盘中的数据块称为 Page,内存中的数据块称为 Buffer,表和索引称为 Relation,行称为 Tuple。数据的读写是以 Page 为最小单位,每个 Page 默认大小为 8kB,在源码编译时可通过./configure --with-blocksize=BLOCKSIZE 设置其他大小,此后都不可更改。每个表文件由多个 BLCKSZ 字节大小的 Page 组成,每个 Page 包含若干 Tuple。

内存中的共享缓冲池缓存了 block 块(默认 1000 个),若缓冲池中的 block 块为脏,需要刷回磁盘,缓冲池细节在此不做赘述,需要时可另起一文解析。

Page 结构

Page 结构包括五部分:

PageHeaderData --在 page 头部,24 个字节长度,记录 page 的元数据信息。

pg_lsn,存储 page 最新更改时,WAL 日志的 lsn 信息。

pg_checksum,存储 page 的校验值。

pd_flags,标志位

pg_lower,到空闲空间开头的偏移量。

pg_upper,到空闲空间结尾的偏移量。

pd_pagesize_version,页面大小和布局版本号信息

pd_prune_xid,页面上最早未删除 XMAX,如果没有则为 0。

ItemIdData --在 page header 之后,一个记录(偏移量,长度)对的数组,指向实际 tuple 项,每个 4 字节。
Free space --未分配的空间(空闲空间)。新项指针从这个区域的开头开始分配,新项从其结尾开始分配。

Items --用来存放行数据 Tuple。

Special space–索引访问模式相关的数据。不同的索引访问方式存放不同的数据。在普通表中为空。
Tuple
页中的元组可细分为 “普通数据元组和 TOAST 元组”。

TOAST (The Oversized-Attribute Storage Technique,超大属性存储技术) 主要用于存储变长数据,当待插入元组的数据大小大于约为 2KB (即页的 1/4) 时候,会自动启动 TOAST 技术来存储该元组。TOAST 较普通元组稍加复杂些,这里主要针对普通元组文件进行说明。
元组内部可以分为三部分,分别是:堆元组头部(23字节)、NULL值位图和用户存储的数据。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论