PostgreSQL技术内幕30:Heap Only Tuple(HOT)原理解析
0.简介
在PostgreSQL中,当更新一条记录时,传统的做法是在数据页(page)中新增一条记录,并保留原来的记录,同时需要为新增的记录增加索引项。这种做法会导致以下问题:1.效率问题:增加索引项会消耗额外的系统资源,从而影响更新操作的效率;2.磁盘空间使用问题:随着索引项的增加,磁盘空间的占用也会相应增加。于是在PG 8.3版本引入了HOT技术,本文将对其实现原理和局限性进行详细的分析。
1.HOT优化原理
1.1 无HOT之前的数据更新
假设存在表t1,其中包含两个列id和value,其中id是主键(主键索引),表中有n条数据,其中一条id为10,在表的第m页第一个偏移,即为(m,1)。在执行update时需要在表数据中插入一条数据同时在索引页中也增加一个新的索引元组。
可以看到在没有HOT时进行更新会导致索引项增加占用空间和降低了更新效率。
1.2 HOT实现原理解析
HOT技术的核心思想是,在更新操作时,如果新版本的数据行与原始数据行位于同一个数据页中,并且没有更新索引字段,那么就不会产生新的索引记录。这样,就可以避免因为更新操作而频繁地更新索引,从而提高更新操作的效率。
具体来说,当满足HOT技术的触发条件时,PostgreSQL会在原始数据行的头部增加一个指针(t_ctid),指向新版本的数据行,同时对其旧元组的t_informask2标志位中设置HEAP_HOT_UPDATED,新元组的对应标志位中设置HEAP_ONLY_TUPLE 。这样,当通过索引访问数据时,就可以根据原始数据行中的指针找到新版本的数据行,而无需更新索引。
可以发现,其中通过原始元组记录新元组的方式实现了不需要增加索引(索引页更新)的数据更新方式,但是如果遇到了清理空间,也就是删除原始元组就需要面临如何查找新元组地址的问题,PG是通过如下方式去解决的:
1)查找索引元组。
2)根据索引元组找到指针”1“。
3)通过重定向行指针”1“找到行指针”2“。
4)通过行指针”2“找到对应元组。
更为详细说明可见:https://github.com/postgres/postgres/blob/master/src/backend/access/heap/README.HOT
2.HOT优化局限性和使用建议
通过上述分析我们知道要触发HOT技术,需要同时满足以下两个条件:
1)更新操作没有更新索引字段:如果更新操作涉及到了索引字段,那么就需要更新索引,此时无法触发HOT技术。
2)新版本的数据行能够容纳在同一个数据页中:如果新版本的数据行无法容纳在原始数据行所在的数据页中,那么就需要将数据行分裂到新的数据页中,并更新索引,此时也无法触发HOT技术。
所以HOT技术优势和限制如下:
1)优势:1.提高更新效率:通过避免频繁更新索引,HOT技术可以显著提高更新操作的效率;2.减少磁盘空间占用:由于不需要为每次更新操作都增加索引记录,因此HOT技术可以减少磁盘空间的占用。
2)限制:1.适用范围有限:HOT技术只适用于新版本数据行与原始数据行位于同一个数据页中的情况,如果数据行跨页更新,则无法触发HOT技术;2.受填充因子(fillfactor)影响:填充因子是一个表级参数,用于控制数据页中的空间占用率。如果填充因子设置得过高,可能会导致数据页无法容纳新版本的数据行,从而无法触发HOT技术。因此,对于频繁进行更新操作的表,可以适当降低填充因子的值来增加HOT技术的触发机会。
其应用建议如下:
1)合理设置填充因子:对于频繁进行更新操作的表,可以适当降低填充因子的值来增加HOT技术的触发机会。但是需要注意的是,过低的填充因子可能会导致数据页碎片化的问题,因此需要权衡利弊进行合理设置。
2)优化索引设计:在设计索引时,需要考虑到HOT技术的触发条件。尽量避免在更新操作中频繁更新索引字段,以提高HOT技术的触发率。
PostgreSQL技术内幕30:Heap Only Tuple(HOT)原理解析