我们知道在数据库行数据更新时,索引也需要进行维护,如果是高并发的情况下,索引维护的代价很大,可能造成索引分裂。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值更新时,会在索引页面中插入一条新的索引元组。

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

欢迎关注我的公众号:数据库架构之美

PostgreSQL HOT技术内幕解读相关推荐

  1. 《PostgreSQL技术内幕:事务处理深度探索》上市了!

    新的个人博客主页:zhangshujie.cn 京东地址 当当地址 淘宝地址 为什么写这本书? 近年来,我一直从事与PostgreSQL相关的数据库内核开发工作,主攻方向是SQL引擎中的查询优化,对事 ...

  2. 技术内幕 | StarRocks Community Champion、阿里云技术专家解读 Optimizer 实现

    作者:范振(花名辰繁),阿里云计算平台-开源大数据-OLAP方向负责人,高级技术专家,StarRocks Community Champion 随着阿里云EMR StarRocks 上线,在和用户交流 ...

  3. 《PostgreSQL 指南:内幕探索》之基础备份与时间点恢复(下)

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

  4. 《PostgreSQL 指南:内幕探索》之基础备份与时间点恢复(上)

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

  5. 荐书:《PostgreSQL指南:内幕探索》| 留言送书

    墨墨导读:最近电子工业出版社博文视点出版了<PostgreSQL指南:内幕探索>,该书为<The Internals of PostgreSQL for database admin ...

  6. ​2020 年大前端技术趋势解读

    作者 | IMWeb 团队 来源 | 腾讯 IMWeb 前端团队公众号 如今的前端早已不再拘泥于满足页面展示,而是开始延展到通过全栈来闭环产品.这表明前端已经有能力透过业务深入产业,继而影响商业结果. ...

  7. ASP.NET Core 技术内幕与项目实战读后感

    前几天拿到了杨中科老师的新书<ASP.NET Core 技术内幕与项目实战>,迫不及待的"两"口气读完了.用一句话来总结,这是一本写给.NET开发者的非常实用的接地气的 ...

  8. 深入分析JavaWeb技术内幕(修订版)

    网站 更多书籍点击进入>> CiCi岛 下载 电子版仅供预览及学习交流使用,下载后请24小时内删除,支持正版,喜欢的请购买正版书籍 电子书下载(皮皮云盘-点击"普通下载" ...

  9. WebKit技术内幕

    WebKit技术内幕(浏览器内核|渲染引擎| HTML5| Chromium项目Committer重磅作品) 朱永盛 著   ISBN 978-7-121-22964-0 2014年6月出版 定价:7 ...

最新文章

  1. 深入全面阐释Struts 2的方方面面
  2. 解决网站在负载均衡环境下SESSION丢失的问题
  3. 执行Bean 实例化
  4. 国产嵌入式操作系统发展思考
  5. SQL Server 相关create操作语句
  6. 安卓现盗号木马 威胁网银盗刷
  7. 联想服务器怎么使用无线网卡,Lenovo无线装置设置界面无法调节无线网卡
  8. 《人月神话》读后感与读书笔记
  9. 分享一个RX8025T时钟芯片的Arduino代码
  10. 抖音下载android,抖音完整版
  11. jQueryphotoClip-图片上传并裁剪
  12. 假设检验实验和拟合优度检验练习题
  13. Jackie Chan Comments Spark Online Backlash
  14. 信息系统项目管理师复习方法学习计划
  15. PCB设计电源平面处理要点
  16. sql server存储过程练习
  17. php面试理论之精选
  18. 转行一年薪水翻倍,我在30岁这年变道改写人生
  19. 数字孪生重点商业实践展示
  20. java的指数函数_Java中常用的数学函数

热门文章

  1. Java实现 兔子数问题
  2. Spring boot 支付宝网站支付
  3. 单链表的十三个基本操作(全)
  4. JS逆向——AES加密案例(openlaw登录)
  5. 项目管理小小知识点总结
  6. 免费瘫软入院,付费发飙成壮汉,YoMail 想干嘛?
  7. Html和Xml中注释符
  8. ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.
  9. 量子信息 量子计算机的新闻,应用挑战知多少?美国学界公布量子信息路线图...
  10. 神经网络在通信中的应用,神经网络技术及其应用