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);
相关推荐
库库林_沙琪马1 小时前
Redis 持久化:从零到掌握
数据库·redis·缓存
牵牛老人2 小时前
Qt中使用QPdfWriter类结合QPainter类绘制并输出PDF文件
数据库·qt·pdf
卡西里弗斯奥4 小时前
【达梦数据库】dblink连接[SqlServer/Mysql]报错处理
数据库·mysql·sqlserver·达梦
温柔小胖5 小时前
sql注入之python脚本进行时间盲注和布尔盲注
数据库·sql·网络安全
杨俊杰-YJ5 小时前
MySQL 主从复制原理及其工作过程
数据库·mysql
一个儒雅随和的男子6 小时前
MySQL的聚簇索引与非聚簇索引
数据库·mysql
V+zmm101348 小时前
基于微信小程序的家政服务预约系统的设计与实现(php论文源码调试讲解)
java·数据库·微信小程序·小程序·毕业设计
roman_日积跬步-终至千里8 小时前
【分布式理论14】分布式数据库存储:分表分库、主从复制与数据扩容策略
数据库·分布式
hadage2338 小时前
--- Mysql事务 ---
数据库·mysql
-$_$-9 小时前
【黑马点评优化】2-Canel实现多级缓存(Redis+Caffeine)同步
数据库·redis·缓存