PostgreSql HOT 技术

摘自唐成的《PostgreSQL修炼之道:从小工到专家(第2版)》。

一、概述

  因为多版本的原因,当 PostgreSQL 中更新一行时,实际上原数据行并不会被删除,只是插入了一个新行。如果表上有索引,而更新的字段不是索引的键值时,由于新行的物理位置发生了变化,仍然需要更新索引,这将导致性能下降,为了解决这一问题,PostgreSQL 自 8.3 版本之后引入了一个名为"Heap-Only Tuple"的新技术,简称 HOT。

二、原理

  使用 HOT 技术之后,如果更新后的行与原数据行在同一个数据块内时,原数据行会有一个指针,指向新行,这样就不必更新索引了,当从索引访问到数据行时,会根据这个指针找到新行。

  HOT 的详细说明见下图,图中表上有一个索引,其中"索引项 n"指向某个数据块的第3行。

  更新第3行后使用HOT技术,索引项仍然指向原数据行(第3行),而第3行原数据行中有一个指针指向新数据行(第6行),见下图:

三、使用示例

  原先的数据块中无法放下新行就不能使用 HOT 技术了,即 HOT 技术中的行之间的指针只能在同一个数据块内,不能跨数据块。所以为了使用 HOT 技术,应该在数据块中留出较大的空闲空间,其方法是可以把表的填充因子"fillfactor"设置为一个较小值。该参数的含义是插入数据时,表中的空间占用率到达多少后就不再插入数据了,默认值为"100",表示不预留空间,但对于删除、插入、更新等操作较多的表来说,需要设置一个较低的值,如50%。该参数可以在建表时设置,命令如下:

sql 复制代码
CREATE TABLE mytest01(id int primary key, col2 text, col3 text, col4 text) WITH (fillfactor=50);

也可以使用ALTER TABLE命令来修改该参数配置:

sql 复制代码
ALTER TABLE mytest01 SET (fillfactor=50);
相关推荐
这个DBA有点耶3 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G3 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备3 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远3 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
geovindu3 天前
sql: Transaction & Concurrency Patterns using postgresql 18
postgresql·数据库开发·数据库架构
2601_962218613 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
张洛闻Eren3 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安3 天前
MySQL-触发器
数据库·mysql
白远山3 天前
上海24小时自助健身房解决方案实战指南与经验分享
java·数据库·架构·需求分析
Omics Pro3 天前
斯坦福Nature+Science|广义虚拟细胞基础大模型
数据库·人工智能·算法·机器学习·自然语言处理