《PostgreSQL技术内幕——原理探索》第七章 堆内元组与仅索引扫描

0    45    1

Tags:

👉 本文共约6962个字,系统预计阅读时间或需27分钟。

本章中介绍两个和索引扫描有关的特性—— 堆内元组(heap only tuple, HOT)仅索引扫描(index-only scan)

7.1 堆内元组(HOT)

在8.3版本中实现的HOT特性,使得更新行的时候,可以将新行放置在老行所处的同一个数据页中,从而高效地利用索引与表的数据页;HOT特性减少了不必要的清理过程。

在源码的README.HOT中有关于HOT的详细介绍,本章只是简短的介绍HOT。首先,7.1.1节描述了在没有HOT特性的时候,更新一行是怎样一个过程,以阐明要解决的问题。接下来,在7.1.2中将介绍HOT做了什么。

7.1.1 没有HOT时的行更新

假设表tbl有两个列:iddataidtbl的主键。

tbl有1000条元组;最后一个元组的id是1000,存储在第五个数据页中。最后一条元组被相应的索引元组所引用,索引元组的key是1000,且tid(5,1),如图7.1(a)所示。

图 7.1 没有HOT的行更新

《PostgreSQL技术内幕——原理探索》第七章 堆内元组与仅索引扫描

我们考虑一下,没有HOT特性时,最后一个元组是如何更新的。

在该场景中,PostgreSQL不仅要插入一条新的表元组,还需要在索引页中插入新的索引元组,如图7.1(b)所示。索引元组的插入消耗了索引页的空间,而且索引元组的插入和清理都是开销很大的操作。HOT的目的,就是降低这种影响。

7.1.2 HOT如何工作

当使用HOT特性更新行时,如果被更新的元组存储在老元组所在的页面中,PostgreSQL就不会再插入相应的索引元组,而是分别设置新元组的HEAP_ONLY_TUPLE标记位与老元组的HEAP_HOT_UPDATED标记位,两个标记位都保存在元组的t_informask2字段中。如图7.2和7.3所示;

图7.2 HOT的行更新

《PostgreSQL技术内幕——原理探索》第七章 堆内元组与仅索引扫描 《PostgreSQL技术内幕——原理探索》第七章 堆内元组与仅索引扫描

比如在这个例子中,Tuple_1Tuple_2分别被设置成HEAP_HOT_UPDATEDHEAP_ONLY_TUPLE

另外,在修剪(pruning)碎片整理(defragmentation)处理过程中,都会使用下面介绍的HEAP_HOT_UPDATEDHEAP_ONLY_TUPLE标记位。

接下来会介绍,当基于HOT更新一个元组后,PostgreSQL是如何在索引扫描中访问这些被HOT更新的元组的,如图7.4(a)所示。

图7.4 行指针修剪

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!
《PostgreSQL技术内幕——原理探索》第七章 堆内元组与仅索引扫描后续精彩内容已被小麦苗无情隐藏,请输入验证码解锁本站所有文章!
验证码:
请先关注本站微信公众号,然后回复“验证码”,获取验证码。在微信里搜索“DB宝”或者“www_xmmup_com”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

嘿,我是小麦,需要帮助随时找我哦。
  • 18509239930
  • 个人微信

  • DB宝
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部