本文介绍: 因为多版本原因,当 PostgreSQL 中更新一行时,实际上原数据行并不会被删除,只是插入一个新行。如果表上有索引,而更新字段不是索引键值时,由于新行的物理位置发生了变化,仍然需要更新索引,这将导致性能下降,为了解决这一问题,PostgreSQL 自 8.3 版本之后引入一个名为“Heap-Only Tuple”的新技术,简称 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%。该参数可以建表时设置,命令如下

CREATE TABLE mytest01(id int primary key, col2 text, col3 text, col4 text) WITH (fillfactor=50);

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

ALTER TABLE mytest01 SET (fillfactor=50);

原文地址:https://blog.csdn.net/songyundong1993/article/details/134803132

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_43792.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注