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

postgresql表文件内部结构

原创 Oracle 2023-01-15
475

表文件内部结构
将保存在磁盘中的块称为 Page ,而将内存中的块称为 Buffer ,表和
索引称为 Relation ,行称为 Tuple。 数据的读写是以 Page 为最小单位, 每个Page 默认大小为 8kB ,在编译 时指定的 BLOCKSZ 大小决定 Page 的大小 。 每个表文件由多个 BLOCKSZ 字节大小的 Page 组成, 每个 Page 包含若干 Tuple 。 对于 I/O 性能较好的硬件,并且以分析为主的数据库,适当增加 BLCKSZ 大小可以小幅提升数据库性能 。
 PageHeader 描述了一个数据页的页头信息,包含页的一些元信息 。 它的结构及其结构指针 PageHeader 的定义如下:






pd_lsn : 在 ARIES Recovery Algorithm 的解释中,这个 lsn 称为 PageLSN ,它确定和记录了最后更改此页的 xlog 记录的 LSN ,把数据页和 WAL 日志关联,用于恢复数据时校验日志文件和数据文件的一致’性; pd_lsn 的高位为 xlogid ,低位记录偏移量 ;因为历史原因, 64 位的 LSN 保存为两个 32 位的值 。
pg_flags :标识页面的数据存储情况 。
pd_special : 指向索引相关数据的开始位置,该项在数据文件中为空,主要是针对不同索引 。
pd_lower :指向空闲空间的起始位置 。
pd_upper :指向空闲空间的结束位置 。
pd_pagesize_version : 不同的 PostgreSQL 版本的页的格式可能会不同 。
pd一linp[l]:行指针数组,即图 5-3 中的 Item!, Item2, … , Itemn ,这些地址指向Tuple 的存储位置 。
如果一个表由 一个只包含一个堆元组 的页面组成 。 该页面的 pd_lower 指向 第一行指针,并且行指针和 pd_upper 都指向第一个堆元组 。 当第二个元组被插入时,它被放置在第一个元组之后。第二行指针被压入第一行,并指向第二个元组 。 pd_lower 更改为指向第二行指针, pd_upper 更改为第二个堆元组 。 此页面中的其他头数据(例如, pd_lsn, pg_checksum 、 pg_flag )也被重写为适当的值 。
当从数据库中检索数据时有两种典型的访问方法,顺序扫描和 B 树索引扫描 。
顺序扫描通过扫描每个页面中的所有行指针顺序读取所有页面中的所有元组 。 B 树索引扫描时 ,索引文件包含索引 元组 , 每个元组由索引键和指 向目 标堆元组的 TID 组成 。 如果找到了正在查找的键的索引元组, 使用获取的 TID 值读取所需的堆元组 。
每个 Tuple 包含两部分 的内容 ,一部分为 HeapTupleHeader,用来保存 Tuple 的元信息,如图 5-4 所示,包含该 Tuple 的 OID 、 xmin 、 cmin 等 ;另 一部分为 HeapTuple ,用来保存 Tuple 的数据 。






————————————————
版权声明:本文为CSDN博主「XiaoYang Mum」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

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

评论