PostgreSQL之tuple结构

本文详细介绍了PostgreSQL堆表中Tuple的结构,包括头信息、NULLbitmap和用户数据。在插入、删除和更新操作中,Tuple的t_xmin、t_xmax、t_cid和t_ctid字段如何变化。删除不是真正移除,而是标记为已删除;更新操作实际上是删除+插入。此外,还提到了FreeSpaceMap(FSM)在页面空间管理中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在上一篇文章PostgreSQL之堆表存储(Heap Table)中我们了解了PostgreSQL中堆表的存储结构,以及对于堆表的tuple是如何写入和读取的,不过我们只涉及到如何把想要的tuple从表对应的页面读取出来或者把tuple如何写到页面去,但是关于tuple内部的细节并没有说明。本文我们将着重学习一下tuple的内部结构以及对于增删改操作tuple是如何变化的。

Tuple结构

一个Tuple的结构主要包含三部分:由HeapTupleHeaderData结构定义的头信息,NULL bitmap以及用户数据,如下图所示。
在这里插入图片描述
NULL bitmap和用户数据很好理解,那么重点就是这个Tuple的头信息里面都代表了啥,从上图中我们可以看出,header里面重点的信息为t_xmin、t_xmax、t_cid、t_ctid。

  • t_xmin - 记录插入此行的事务号txid。
  • t_xmax - 记录此行被删除的事务号txid。如果此行未被删除或更新,值为0。
  • t_cid - 记录此行是在事务中的第几条SQL,如果是第一条值就是0,第二条值就是1,依次类推。比如对于’BEGIN;INSERT;INSERT;INSERT.COMMIT;'这样一个事务,这行是第三个INSERT中插入的,那么t_cid的值就是2。
  • t_ctid - 记录tuple identifier(TID),我们在前面的文章了介绍了TID是由block number+offset number组成的一个二元组,因此这个t_ctid就是一个用二元组表示的TID。如果对应行没有被更新,那么值就代表这个行自己,如果行被更新了,值指向新的行。可以理解这个t_ctid就是一个行的物理地址,对应到哪个页面中的哪条tuple位置。
    了解完Tuple的组成结构后,我们再看一下对于insert、update和delete操作对于Tuple的变更情况。

插入(Insert)

以下图为例,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据源的港湾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值