前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PostgreSql pageinspect 更深的理解PG

PostgreSql pageinspect 更深的理解PG

作者头像
AustinDatabases
发布2020-05-09 16:52:19
1.4K0
发布2020-05-09 16:52:19
举报
文章被收录于专栏:AustinDatabases

如果使用MYSQL 相对页面的层次进行一些了解,估计你就的找大佬们的工具集合,并且为此膜拜大佬们,但PG并不需要这样,PG自身自带的pageinspect 工具,就可以让你对页面级别的层次来进行一个 “透心凉” 的查看和分析,并不在为此苦恼。

首先确认您是否拥有了 pageinspect 这个 extension ,下图通过查看pg_extension这个表您可以确认,当前您的PG上已经安装了这个extension.

如果没有请 create extension pageinspect; 执行这条预计在您当前的数据块中,如果还不行,请您确认您的PG 安装与编译是否正常。

select * from heap_page_items(get_raw_page('test',0)) order by lp_off desc;

通过上面的的图,是可以推理出数据存储是从页尾开始的,数据的插入顺序与步进之间的关系。

SELECT * from page_header(get_raw_page('test', 0));

lower = 72 , 通过这里可以获知当前PG的表TEST 中曾经有过多少tumple(在这一刻),PG的每页有28bytes 的页头,同时每个指针是4bytes ,(72 - 28)/4 = 11 ,证明当前的指针有11个。

我们插入一条记录

insert into test select generate_series(1,1), random()*100, random()*1, now();

从上图可以看出,指针并未有变化,并通过查看数据和页面的情况,看到新插入的记录,使用了之前空出的 ctid (0,1) 位置,所以指针并不需要在重新分配。

我们继续在插入两条记录,可以看出指针分配了4个字节,并且新的记录也插入了未分配的空间,每行的偏移量是64bytes

我们删除 ID > 5 的记录

然后 vacuum test表

通过命令我们也可以看到 vacuum 后的空间回收了,并且页头也重新标记了次页面的容量,但指针是不在回收了。

通过上面几个简单的命令就可以,理解一些枯燥乏味的PG 某些原理,也是不错的体验。

如果还不理解上面的意思可以看下面这个图(由于信息量太大,所以只能截断成两个图)

这两张图拼在一起,呈现的就是一个完整的页面上面28个字节头,+ 每个指针 下面就是你存储的每行数据,所以在此证明了页面存储的方式和逻辑中间的0 都是未占用的空间。

我想到此也就没有什么人不在不理解 PG的页面了,试问还有那个数据库在不通过第三方的插件或软件的情况下,能如此通透的展现一个页面在你面前。

SELECT get_raw_page::text FROM get_raw_page('test', 0);

相关的页面获得的源代码,将页面的内容memcpy到buffer 然后给大家展现出来。

那如果有人问,你的数据到底占用了多少个页面,我看看看怎么来通过某种方式来回答他。

1 一个页面我有多少数据

2 一共有多少行数据

2 /1 约等于 多少页面

我们看看上面的算法是不是可以应用到PG 中

从结果看,还是比较准确的。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档