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

postgresql堆表文件的内部结构

原创 Oracle 2022-11-21
678


在表对应的datafile中,被分离为固定大小的page(or block),默认为8KB,这些page在datafile中从0开始计数,如果一个page被填充满,那么就会生成新的page以添加到文件,所以我们看到的datafile会随着表的增大,也在不断增大。

postgre=# create table heap_t(id int, name varchar(20));
ERROR:  syntax error at or near "name"
LINE 1: create table heap_t(id intname varchar(20));
                                     ^
postgre=# create table heap_t(id int,name varchar(20));
CREATE TABLE
postgre=# select pg_relation_size(heap_t);
ERROR:  column "heap_t" does not exist
LINE 1: select pg_relation_size(heap_t);
                                ^
postgre=# select pg_relation_size('heap_t')
postgre-# ;
 pg_relation_size 
------------------
                0
(1 row)

postgre=# insert into heap_t values(1);
INSERT 0 1
postgre=# 
postgre=# select pg_relation_size('heap_t')
;
 pg_relation_size 
------------------
             8192
(1 row)

postgre=# 

一个堆表数据文件的内部结构设计如下图:


一个表的page包括三种类型的数据

1.heap tuple: 存放数据本身,从一个page的末端有序的堆积。

2.line pointer: 一个四字节的行指针,指向每一个heap tuple,也叫item pointer,line pointer是一个简单的数组,索引page的数据文件是从1开始计数,也叫offset number,新的tuple增加到page时,line piniter就在推送到数组中,指向新的tuple.

3.header data: header data是page生成的时候随之产生的,由pageHeaderData定义结构,24个字节长,包含了page的一般信息,主要结构描述如下:

pd_lsn: 存储XLOG最后的改变的这个page的LSN号,是一个8字节的无符号整数,和WAL相关,后续章节会有描述

pd_checksum:存储page的校验和

pd_lower,pd_upper: pd_lower指向line pointer的尾部,pd_upper指向最新heap tuple的开头

pd_special: 此变量用于索引,在表的page中,它指向page的末尾(在索引的page中,它指向特殊空间的开头)

Page Header定义参考:


原文链接:https://blog.csdn.net/murkey/article/details/106089239

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

评论