暂无图片
分享
suger
2023-05-22
HOT原理

HOT原理

收藏
分享
2条回答
默认
最新
T
Ty3306

没有HOT时的场景(Heap Only Tuple)

当pg更新一条数据时,实际是将旧数据标记为dead再新插入一条数据。当列上有索引时,即使更新的不是索引键字段,也要再新增一个索引项,指向新元组(因为整条元组的物理位置改变了)。当update的数据量大时,不仅性能低,也会引发索引的膨胀,同时还会增加额外的索引清理成本。

什么是HOT(堆内元组)

pg 8.3版本引入,满足以下条件的元组被称为堆内元组:

更新前后的元组能在同一个数据块内放下(fillfactor参数越小,可用于更新的空间越大)
所有索引键字段未被更新(更新前后为同一个值的,认为没有更新)
HOT原理

当进行HOT更新时,不需要再新增索引项和指针,索引仍指向旧元组,查询数据时通过ctid访问新版本元组即可。这大大提升了带索引字段的更新效率,也减少了索引的膨胀。

另外,结合pg的page pruning技术,可以在平时的操作(例如select)时就对页内死元组和无用的索引指针进行清理,而不需要等到vacuum执行,减少了vacuum的工作量。

更新后还会设置元组标记:

新元组t_informask2字段设置为HEAP_ONLY_TUPLE
老元组t_informask2字段设置为HEAP_HOT_UPDATED 

暂无图片 评论
暂无图片 有用 0
暂无图片
suger
问题已关闭: 问题已经得到解决
暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏