学习
实践
活动
专区
工具
TVP
写文章
专栏首页数据库架构之美Postgresql HOT技术内幕解读

Postgresql HOT技术内幕解读

我们知道在数据库行数据更新时,索引也需要进行维护,如果是高并发的情况下,索引维护的代价很大,可能造成索引分裂。Pg为了避免这个问题,采用了HOT(堆内元组技术)解决这个问题,下面我们就这个技术详细探讨一下。

我们先看看postgresql中page的结构:

pd_lsn:本页面最后一次变更所写入的xlog记录对应的lsn。

pd_checksum:页面校验和。

pd_lower:指向行指针的末尾(空闲空间开始位置)。

pd_upper:指向最新堆元组的起始位置(空闲空间结束位置)。

pd_special:用在索引页中,在索引页中它指向特殊空间的起始位置,在堆表页面中它指向页尾。

pd_pagesize_version:页面大小以及页面布局的版本号。

pd_prune_xid:本页面可以修剪的最老元组的xid。

从上面的结构我们可以看到,pd_lower和pd_upper分别指向空闲空间的起始和终止位置,而图中的1和2是行指针,分别指向真实的元组位置。

了解了page的结构后我们再来看看元组的结构:

t_mix:插入此元组的事务txid。

t_max:删除或更新此元组的事务txid,如果为删除或更新则为0。

t_cid:command id,在当前事务中,已经执行过多少条sql,例如执行第一条sql时cid=0,第二条cid=2。

t_ctid:保存着执行自身或者新元组的元组标识符(tid),在更新元组后tid指向新版本的元组,否则指向自己,这个我们后面会细细讨论。

介绍完上面的基本概念后我们再来看看postgresql如何通过b树索引找到对应的数据行的。

我们知道索引元组中是kv的结构,key代表的是查询条件的值,value即TID,TID中记录了两部分信息,block=2代表页面号,数据位于第几个块(页面),offset=2代表第二个元组,这样就通过索引直接定位了某一条记录,而不需要对页面进行扫描。

下面我们进入正题,我们再来看看元组是如何更新的,我们知道元组的更新其实是新插入一条记录如下图所示,如果没有hot技术的话,每更新一个行,就会插入一个元组,同时会在索引页中新增一一条元组,该元组中的tid指向新的元组,而索引的维护开销也是非常大的,可以想象,这样的话在频繁更新的系统中不仅数据会膨胀而且索引也会膨胀,同时维护索引的开销太大。

于是postgresql使用HOT(堆内元组技术)解决这个问题,总体思想是在更新时通过修改指针指向定位新元组,而不需要插入相应的索引元组。我们来看看hot更新的流程:

在元组结构的t_informask2字段中有两个标记位,heap_hot_update和heap_only_tuple,在更新tuple1时,postgresql会将tuple1(老元组)的标记位置为heap_hot_update,同时将tuple2(新元组)的标记位置为heap_only_tuple。

1.首先找到目标数据的索引元组

2.然后通过索引元组中的位置,访问行指针数组,找到行指针1

3.读取tuple1

4.发现tuple1的标记位是heap_hot_update,于是通过tuple1的t_ctid字段读取tuple2(上面也提到过,当元组被更新过后,元组的t_ctid字段指向新的元组)

上面的过程其实访问了tuple1和tuple2两个数据块,这时我们可能会考虑到一个问题,如果tuple1因为vacuum清理掉了,就无法通过tuple的ctid字段定位到tuple2了,为了解决这个问题,postgresql会在合适的时候进行行指针的重定向(redirect),这个过程称为修剪。

此时访问新元组的流程如下:

1.首先找到目标数据的索引元组

2.然后通过索引元组中的位置,访问行指针数组,找到行指针1

3.通过行指针的重定向,找到行指针2

4.通过行指针2定位tuple2

在postgresql进行修剪时,会挑选合适的时机来清理死元组,这个过程称为碎片整理,如下图所示:

碎片整理并不会清理索引元组,所以碎片整理比普通vacuum清理的开销要小的多。HOT特性降低了表和索引的空间消耗,同时减少了vacuum需要处理的元组数量,对于性能有很好的提升。

当然HOT技术也不是万能的,它也有不适用的场景,比如下面两个场景:

1.当更新的元组和老元组不在同一个page中时,指向该元组的索引元组也会被添加到索引页面中。

2.当索引的key值更新时,会在索引页面中插入一条新的索引元组。

学习精益求精,技术永无止境,加油吧。

文章分享自微信公众号:
数据库架构之美

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

作者:数据库架构之美
原始发表时间:2019-07-25
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 俄罗斯postgresql公司PostgresPro新书:PG14技术内幕

    Postgrespro是俄罗斯著名的数据库公司,旗下主要产品基于PostgreSQL。近期发布了一本新书“PostgreSQL 14 Internals”。

    yzsDBA
  • 免费报名 | 腾讯云自研数据库CynosDB交流会

    All in 云+时代,数据库的高可用性、按需付费、按需扩展等属性解放了大批开发者。腾讯发布的自研数据库CynosDB作为国内首款同时兼容MySQL和PG的云原...

    腾讯技术工程官方号
  • 邀您参加 | 腾讯云自研数据库CynosDB技术交流会

    All in 云+时代,数据库的高可用性、按需付费、按需扩展等属性解放了大批开发者。腾讯发布的自研数据库CynosDB作为国内首款同时兼容MySQL和PG的云原...

    腾讯云数据库 TencentDB
  • 免费报名 | 腾讯云自研数据库CynosDB交流会

    All in 云+时代,数据库的高可用性、按需付费、按需扩展等属性解放了大批开发者。腾讯发布的自研数据库CynosDB作为国内首款同时兼容MySQL和PG的云原...

    腾讯大讲堂
  • 邀您参加 | 腾讯云自研数据库CynosDB技术交流会

    点击上方蓝字关注每天学习数据库 All in 云+时代,数据库的高可用性、按需付费、按需扩展等属性解放了大批开发者。腾讯发布的自研数据库CynosDB作为国内...

    腾讯数据库技术
  • 10 月数据库排名:“三大王”无人能敌,PostgreSQL 紧随其后

    DB-Engines最近发布了2020年10月份的数据库排名。该网站根据数据库管理系统的受欢迎程度对其进行排名,实时统计了359种数据库的排名指数。前10名的排...

    逆锋起笔
  • 邀您参加 | 腾讯云自研数据库CynosDB技术交流会

    点击上方蓝字关注每天学习数据库 All in 云+时代,数据库的高可用性、按需付费、按需扩展等属性解放了大批开发者。腾讯发布的自研数据库CynosDB作为国内...

    腾讯云数据库 TencentDB
  • PostgreSQL的日志文件和数据加载

    墨墨导读:本文主要介绍PostgreSQL的日志文件参数及注意事项,从csv日志中载入数据库。通过灵活的数据加载方式,让SQL在处理很多问题上更加简捷便利。

    数据和云
  • 【云+技术沙龙回顾】腾讯云自研数据库CynosDB交流会北京站

    2019年3月16日,由云+社区主办的腾讯云自研数据库 CynosDB 交流会,在北京北邮科技酒店举行,本次交流会带你全方位了解 CynosDB、揭秘技术内幕,...

    腾讯云开发者社区技术沙龙
  • 在线畅游腾讯云PostgreSQL家族,明天见!

    1月7日,一年一度的《PostgreSQL中国技术大会》将在线上召开,本次大会以“开源论道,创新驱动,共建数字化未来”为主题,重点围绕新场景、新技术、新应用等...

    腾讯云数据库 TencentDB
  • 解读年度数据库PostgreSQL:如何处理并发控制(一)

    墨墨导读:最近电子工业出版社博文视点出版了《PostgreSQL指南:内幕探索》,日前「数据和云」公众号推荐了这本书并赠送了五本,百多位用户参与,几十条留言未能...

    数据和云
  • PostgreSQL堆内元组、动态剪枝技术介绍

    上一篇文章《PostgreSQL的元组、页面结构及索引查找原理》中介绍了postgresql数据库数据结构和索引查找过程,本文接着继续介绍下堆内元组和动态剪枝技...

    数据库架构之美
  • 我被代码摧残掉的头发居然又长出来了!!

    其实,现在分辨一个人的职业很简单:见到人就习惯性笑脸相迎的80%是商务,带着笔记本挨个工位穿梭的大概率是产品,而身着格子衫头顶仅有为数不多的几根头发在飘摇的,上...

    腾讯云数据库 TencentDB
  • 解读年度数据库PostgreSQL:如何巧妙地实现缓冲区管理器

    墨墨导读:PostgreSQL 已获得 DB-Engines 排行榜 2017 年和2018年的“年度数据库”称号,发展如此迅猛,它究竟有什么内幕呢?接下来,我...

    数据和云
  • 第十届PostgreSQL中国技术大会(线下)售票进行中

    疫情之下,很多大会转到线上。疫情隔断了大家的连接,隔断了人们的沟,但线上大会不能取代线下大会!

    云加小助手
  • 大牛书单 | 数据库专题好书分享

    导语:读书是一生的功课,技术人通过读书实现自我提升,学习优秀技术沉淀。TEG读书会本期特邀腾讯金融云专家工程师李海翔、TEG计费平台部专家工程师雷海林、MySQ...

    腾讯技术工程官方号
  • 解读年度数据库PostgreSQL:如何巧妙地实现缓冲区管理器

    原文:http://www.enmotech.com/web/detail/1/752/1.html

    数据和云01
  • 免费报名 | 腾讯云自研数据库CynosDB交流会

    All in 云+时代,数据库的高可用性、按需付费、按需扩展等属性解放了大批开发者。腾讯发布的自研数据库CynosDB作为国内首款同时兼容MySQL和PG的云原...

    腾讯云开发者社区技术沙龙

扫码关注腾讯云开发者

领取腾讯云代金券