当前位置:网站首页>PG--核心技术--HOT

PG--核心技术--HOT

2022-08-11 11:32:00 51CTO

索引更新问题

因为多版本的原因,当PostgreSQL中更新一行时,实际上原数据行并不会被删除,只是插入了一个新行。如果表上有索引,而更新的字段不是索引的键值时,由于新行的物理位置发生了变化,仍然需要更新索引,这将导致性能下降。

引入HOT

为了解决这一问题,PostgreSQL自8.3版本之后引入了一个名为“Heap-Only Tuple”的新技术,简称HOT。使用HOT技术之后,如果更新后的行与原数据行在同一个数据块内时,原数据行会有一个指针,指向新行,这样就不必更新索引了,当从索引访问到数据行时,会根据这个指针找到新行。

HOT的原理

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

PG--核心技术--HOT_数据

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

PG--核心技术--HOT_数据块_02

HOT的使用和配置

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

      
      
CREATE TABLE mytest01 (id int primary key ,
col2 text , col3 text , col4 text )
WITH (fillfactor = 50 ) ;
  • 1.
  • 2.
  • 3.

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

      
      
ALTER TABLE mytest01 SET (fillfactor = 50 ) ;
  • 1.


原网站

版权声明
本文为[51CTO]所创,转载请带上原文链接,感谢
https://blog.51cto.com/u_13874232/5565887