当前位置: 首页 > news >正文

PostgreSQL技术内幕30:Heap Only Tuple(HOT)原理解析

0.简介

在PostgreSQL中,当更新一条记录时,传统的做法是在数据页(page)中新增一条记录,并保留原来的记录,同时需要为新增的记录增加索引项。这种做法会导致以下问题:1.效率问题:增加索引项会消耗额外的系统资源,从而影响更新操作的效率;2.磁盘空间使用问题:随着索引项的增加,磁盘空间的占用也会相应增加。于是在PG 8.3版本引入了HOT技术,本文将对其实现原理和局限性进行详细的分析。

1.HOT优化原理

1.1 无HOT之前的数据更新

假设存在表t1,其中包含两个列id和value,其中id是主键(主键索引),表中有n条数据,其中一条id为10,在表的第m页第一个偏移,即为(m,1)。在执行update时需要在表数据中插入一条数据同时在索引页中也增加一个新的索引元组。
在这里插入图片描述

可以看到在没有HOT时进行更新会导致索引项增加占用空间和降低了更新效率。

1.2 HOT实现原理解析

HOT技术的核心思想是,在更新操作时,如果新版本的数据行与原始数据行位于同一个数据页中,并且没有更新索引字段,那么就不会产生新的索引记录。这样,就可以避免因为更新操作而频繁地更新索引,从而提高更新操作的效率。
具体来说,当满足HOT技术的触发条件时,PostgreSQL会在原始数据行的头部增加一个指针(t_ctid),指向新版本的数据行,同时对其旧元组的t_informask2标志位中设置HEAP_HOT_UPDATED,新元组的对应标志位中设置HEAP_ONLY_TUPLE 。这样,当通过索引访问数据时,就可以根据原始数据行中的指针找到新版本的数据行,而无需更新索引。

在这里插入图片描述

可以发现,其中通过原始元组记录新元组的方式实现了不需要增加索引(索引页更新)的数据更新方式,但是如果遇到了清理空间,也就是删除原始元组就需要面临如何查找新元组地址的问题,PG是通过如下方式去解决的:

1)查找索引元组。

2)根据索引元组找到指针”1“。

3)通过重定向行指针”1“找到行指针”2“。

4)通过行指针”2“找到对应元组。

在这里插入图片描述
更为详细说明可见:https://github.com/postgres/postgres/blob/master/src/backend/access/heap/README.HOT

2.HOT优化局限性和使用建议

通过上述分析我们知道要触发HOT技术,需要同时满足以下两个条件:

1)更新操作没有更新索引字段:如果更新操作涉及到了索引字段,那么就需要更新索引,此时无法触发HOT技术。
2)新版本的数据行能够容纳在同一个数据页中:如果新版本的数据行无法容纳在原始数据行所在的数据页中,那么就需要将数据行分裂到新的数据页中,并更新索引,此时也无法触发HOT技术。
所以HOT技术优势和限制如下:
1)优势:1.提高更新效率:通过避免频繁更新索引,HOT技术可以显著提高更新操作的效率;2.减少磁盘空间占用:由于不需要为每次更新操作都增加索引记录,因此HOT技术可以减少磁盘空间的占用。
2)限制:1.适用范围有限:HOT技术只适用于新版本数据行与原始数据行位于同一个数据页中的情况,如果数据行跨页更新,则无法触发HOT技术;2.受填充因子(fillfactor)影响:填充因子是一个表级参数,用于控制数据页中的空间占用率。如果填充因子设置得过高,可能会导致数据页无法容纳新版本的数据行,从而无法触发HOT技术。因此,对于频繁进行更新操作的表,可以适当降低填充因子的值来增加HOT技术的触发机会。
其应用建议如下:
1)合理设置填充因子:对于频繁进行更新操作的表,可以适当降低填充因子的值来增加HOT技术的触发机会。但是需要注意的是,过低的填充因子可能会导致数据页碎片化的问题,因此需要权衡利弊进行合理设置。
2)优化索引设计:在设计索引时,需要考虑到HOT技术的触发条件。尽量避免在更新操作中频繁更新索引字段,以提高HOT技术的触发率。

PostgreSQL技术内幕30:Heap Only Tuple(HOT)原理解析

相关文章:

  • 五一旅游潮涌:数字化如何驱动智慧旅游升级
  • HiklQQBot开源程序基于python的轻量qq官方机器人框架 快速部署启动官方QQ机器人 插件编写简单易懂 支持小白AI一键生成插件
  • 乌班图安装docker
  • XML Forms Data Format (XFDF) 工作原理、数据结构、使用场景以及与缓冲区的交互方式
  • FPGA实战项目2———多协议通信控制器
  • UG471 之 SelectIO 逻辑资源
  • 高频微服务面试题总结
  • 19、HashTable(哈希)、位图的实现和布隆过滤器的介绍
  • 【Go底层】http标准库服务端实现原理
  • A* (AStar) 寻路
  • MySQL 的事务(Transaction)
  • 使用pyTorch 自然语言处理(NLP)知识库创建
  • 第十七章,反病毒---防病毒网管
  • Ubuntu 第11章 网络管理_常用的网络配置命令
  • AT9880B北斗单模卫星定位SOC芯片
  • 报错 | vitest中,vue中使用jsx语法,报错:ReferenceError: React is not defined
  • Java设计模式之单例模式:从入门到精通
  • 虚假AI工具通过Facebook广告传播新型Noodlophile窃密木马
  • 国产Excel处理控件Spire.XLS系列教程:C# 将Excel文件转换为Markdown格式
  • C++Primerplus编程练习 第六章
  • 复旦大学文科杰出教授裘锡圭逝世,享年90岁
  • 汪明荃,今生不负你
  • 大四本科生已发14篇SCI论文?学校工作人员:已记录汇报
  • 司法部:民营经济促进法明确禁止违规异地执法、利用行政或者刑事手段违法干预经济纠纷
  • 姜再冬大使会见巴基斯坦副总理兼外长达尔
  • 再有20余篇论文出现“妇科男患者”“前列腺女患者”,如何破除“水论文”灰产链?