PostgreSQL核心揭秘(三)-元组结构

c0b749955bcea90756db873c2dbc767c.jpeg

目录

  1. 概述

2. 堆元组介绍   
    1)HeapTupleHeaderData 结构     
    2)空值位图(Null Bitmap)   
    3)用户数据(User Data)

3. 元组增、删、改操作介绍   

    1)增(INSERT)操作    

    2)删(DELETE)操作    

    3)改(UPDATE)操作

4. 总结

概述
在PostgreSQL中,堆元组(Heap Tuple)是表中一行数据的内部表示。每个堆元组都存储在一个页面(通常为8KB)内,并且由三个主要部分组成:HeapTupleHeaderData 结构、空值位图以及用户数据。

详细介绍

1. HeapTupleHeaderData 结构

HeapTupleHeaderData 是元组头部的数据结构,它包含了关于该元组的一些关键信息。这些信息包括事务相关的数据和一些标志位,用于多版本并发控制(MVCC)。

以下是其主要字段:

类型

长度

描述

t_xmin

交易 ID

4 字节

插入 XID 图章

t_xmax

交易 ID

4 字节

删除 XID 图章

t_cid

CommandId

4 字节

插入和/或删除 CID 图章(与 t_xvac 叠加)

t_xvac

交易 ID

4 字节

XID 用于 VACUUM 操作移动行版本

t_ctid

ItemPointerData (项目指针数据)

6 字节

此行版本或更新行版本的当前 TID

t_infomask2

uint16

2 字节

属性数量,以及各种标志位

t_infomask

uint16

2 字节

各种标志位

t_hoff

uint8

1 字节

用户数据的偏移量

2. 空值位图(Null Bitmap)

空值位图是一个可选的部分,仅当表中有允许NULL值的列时存在。这个位图用来标记哪些列的值是NULL。每个位对应一个列,如果某一位被设置,则表示相应的列是NULL。

3. 用户数据(User Data)

用户数据部分包含实际的字段值。这些值按照表定义中列的顺序排列。对于固定长度的数据类型(如int4),直接存储在用户数据部分;对于可变长度的数据类型(如text、varchar),则会有一个长度前缀,随后是实际的数据。

114cfeed08af7e455c114d524dd15ccf.png

元组增、删、改操作介绍

1. 增(INSERT)操作

f9b8af494da1cede34e0e1ad5a46c8e8.png

假设元组是由 txid=99 的事务插入页面中的,这时被插入元组的首部字段设置如下:

Tuple:

  • t_xmin:设置为 99,因为此元组由 txid=99 的事务所插入。

  • t_xmax:设置为 0,因为此元组尚未被删除或更新。

  • t_cid:设置为 0,因为此元组是由 txid=99 的事务所执行的第一条命令插入的。

  • t_ctid:设置为 (0,1),指向自身,因为这是该元组的最新版本。

2. 删(DELETE)操作

38f1e7c27348b7d210c0419b752952fd.png

假设接下来事务 txid=100 对元组进行了删除操作。此时,删除操作会设置如下:

Tuple(删除后状态):

  • t_xmin:保持为 99,表示该元组的插入事务。

  • t_xmax:设置为 100,因为此元组现在被 txid=100 的事务删除。

  • t_cid:设置为 0,因为删除操作是由 txid=100 事务的第一条命令执行的。

  • t_ctid:保持为 (0,1),仍指向原元组。

死元组最终将从页面中被移除。清除死元组的过程被称为清理(VACUUM)过程

3. 改(UPDATE)操作

0cbf544eb4452cdf61ced1a2e83ee179.png

如果在 txid=101 的事务中,对该元组进行了更新操作。此时,更新操作会创建一个新的元组,且原元组保持不变。新元组的设置如下:

当执行第一条UPDATE命令时,Tuple_1的t_xmax被设为txid 100,在逻辑上被删除,然后Tuple_2被插入,接下来重写Tuple_1的t_ctid以指向Tuple_2。Tuple_1和Tuple_2的头部字段设置如下。

第一条 UPDATE 命令

逻辑删除 Tuple_1:

  • Tuple_1 的 t_xmax 被设置为 100(txid)。

  • Tuple_1 的 t_ctid 从 (0,1) 改写为 (0,2),指向新插入的元组。

    Tuple_1 设置:

  • t_xmax: 100、 t_ctid: (0,2)

插入新元组 Tuple_2:

  • Tuple_2 的 t_xmin 被设置为 100(当前事务 txid)。

  • t_xmax 设置为 0(尚未被删除或更新)。

  • t_cid 设置为 0(表示这是该事务的第一条操作)。

  • t_ctid 设置为 (0,2)(指向自身)。

    Tuple_2 设置:

  • t_xmin: 100、t_xmax: 0、t_cid: 0、t_ctid: (0,2)

第二条 UPDATE 命令

逻辑删除 Tuple_2:

  • Tuple_2 的 t_xmax 被设置为 100(当前事务 txid)。

  • Tuple_2 的 t_ctid 从 (0,2) 改写为 (0,3),指向新插入的元组。

     Tuple_2 设置:

  • t_xmax: 100、t_ctid: (0,3)

插入新元组 Tuple_3:

  • Tuple_3 的 t_xmin 被设置为 100(当前事务 txid)。

  • t_xmax 设置为 0(尚未被删除或更新)。

  • t_cid 设置为 1(表示这是该事务的第二条操作)。

  • t_ctid 设置为 (0,3)(指向自身)。

Tuple_3 设置:

  • t_xmin: 100、t_xmax: 0、t_cid: 1、t_ctid: (0,3)

与删除操作类似,如果txid=100的事务已经提交,那么Tuple_1和Tuple_2就成了死元组,而如果txid=100的事务中止,Tuple_2和Tuple_3就成了死元组。

总结

在这个过程中,元组的状态变化如下:

  • 插入:新元组的字段由插入事务的 txid 决定。

  • 删除:删除操作更新t_xmax,记录删除事务的txid。

  • 更新:更新操作创建新的元组,新的 t_xmin 表示更新事务,并且t_cid和t_ctid 反映新的版本信息。

公众号内直接回复加群,即可添加微信群。觉得帖子写的不错,点点关注,点点赞,多多转载,请多多支持。

往期帖子汇总:

数据库维护工具:数据迁移、性能监控、数据修复的全面工具汇总

上一篇:PostgreSQL核心揭秘(二)-进程和内存架构
PostgreSQL核心揭秘(一):数据库集簇

从零开始学PostgreSQL-工具篇2:碎片回收pg_repack

从零开始学PostgreSQL-工具篇:备份与恢复

从零开始学PostgreSQL (十四):高级功能

从零开始学PostgreSQL (十三):并行查询

从零开始学PostgreSQL (十二):高效批量写入数据库

从零开始学PostgreSQL (十一):并发控制

从零开始学PostgreSQL (十):磁盘使用情况

从零开始学PostgreSQL (九):任务进度报告

从零开始学PostgreSQL (八):监控数据库动态

从零开始学PostgreSQL (七):高可用性、负载平衡和复制

从零开始学PostgreSQL (六):备份和恢复

从零开始学PostgreSQL (五):日常数据库维护任务

从零开始学PostgreSQL (四):数据库角色

从零开始学PostgreSQL (三):索引篇

从零开始学PostgreSQL (二):配置文件

从零开始学PostgreSQL (一):Centos8 RPM安装PostgreSQL16

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/466057.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在数据抓取的时候,短效IP比长效IP有哪些优势?

在数据抓取领域,代理IP的选择对于任务的成功率和效率至关重要。短效IP和长效IP各有其特点和适用场景,但在数据抓取过程中,短效IP因其独特的优势而受到青睐。本文将和大家一起探讨短效IP在数据抓取中相比长效IP的优势。 短效IP的定义与特点 …

Navicat for MySQL 错误:1251

mySql:8.4 Navicat for MySQL:11.0.10 企业版 绿色版 官网中关于mysql_native_password插件的说法:链接 1. 问题 连接数据库报错:1251 要求升级Navicat for MySQL 2. 原因 mysql中的mysql_native_password插件默认是关闭的 …

RabbitMQ 管理平台(控制中心)的介绍

文章目录 一、RabbitMQ 管理平台整体介绍二、Overview 总览三、Connections 连接四、Channels 通道五、Exchanges 交换机六、Queues 队列查看队列详细信息查看队列的消息内容 七、Admin 用户给用户分配虚拟主机 一、RabbitMQ 管理平台整体介绍 RabbitMQ 管理平台内有六个模块&…

【360】基于springboot的志愿服务管理系统

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装志愿服务管理系统软件来发挥其高效地信息处理的作用&#x…

Unity发布微信小程序-实战问题汇总

发布微信小程序 准备工作 我们是使用unity其他版本直接转出的微信小程序,而非团结引擎。 下载微信开发者工具:https://developers.weixin.qq.com/minigame/dev/devtools/download.html MiniGame插件:https://game.weixin.qq.com/cgi-bin/gamewxagwasms…

卖模版还能赚到钱吗?

说到赚钱,我想大部分人都会感兴趣。但如果告诉大家现阶段卖模板也能赚钱,可能还是有人不信。我要说说我的观察了。 本文可在公众号「德育处主任」免费阅读 我是一只临期程序猿,我最早接触到“模板能卖钱”这个概念是在模板王里。模板王平台上…

基于梧桐数据库的实时数据分析解决方案

一、背景 在当今信息时代,数据的价值不言而喻。然而,处理海量数据并将其转化为有意义的洞察力是一项艰巨的任务。传统的数据处理方法已经无法满足我们日益增长的需求。为了满足这一挑战,实时数据处理系统应运而生。 ​ 实时数据处理系统是一…

WireShark入门学习笔记

学习视频:WireShark入门使用教程 扩展学习:wireshark分析常见的网络协议 文章目录 WireShark介绍WireShark抓包入门操作WireShark过滤器使用WireShark之ARP协议分析WireShark之ICMP协议TCP连接的3次握手协议TCP连接断开的4次挥手协议WireShark抓HTTP协…

牛客网Java高频面试题(2024最新版含答案)

作为 Java 程序员,选择学习什么样的技术?什么技术该不该学?去招聘网站上搜一搜、看看岗位要求就十分清楚了,自己具备的技术和能力,直接影响到你工作选择范围和能不能面试成功。 如果想进大厂,那就需要在 Ja…

别名路径联想设置

如何使用/进行路径提示? 找到jsconfig.json文件,如何项目中没有的话,自行创建 {"compilerOptions": {"paths": {"/*": ["./src/*"]}},"exclude": ["node_modules", "dis…

【万字详解】如何在微信小程序的 Taro 框架中设置静态图片 assets/image 的 Base64 转换上限值

设置方法 mini 中提供了 imageUrlLoaderOption 和 postcss.url 。 其中: config.limit 和 imageUrlLoaderOption.limit 服务于 Taro 的 MiniWebpackModule.js , 值的写法要 ()KB * 1024。 config.maxSize 服务于 postcss-url 的…

不愧是阿里巴巴最新开源的Java面试笔记,30万字精华总结 + 面试1300问附答案整理

前言 作为一个 Java 程序员,你平时总是陷在业务开发里,每天噼里啪啦忙敲着代码,上到系统开发,下到 Bug 修改,你感觉自己无所不能。然而偶尔的一次聚会,你听说和自己一起出道的同学早已经年薪 50 万&#x…

C6.【C++ Cont】cout的格式输出

目录 1.头文件 2.使用 1.控制宽度和填充 setw函数(全称set field width设置字段宽度) setfill函数(全称Set fill character设置填充字符) 2.控制数值格式 3.控制整数格式 4.控制对齐方式 1.头文件 用cout进行格式化输出前,先引用头文件iomanip(全称input&output m…

基于SSM+小程序的高校寻物平台管理系统(失物1)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 本基于微信小程序的高校寻物平台有管理员,用户以及失主三个角色。 1、管理员功能有个人中心,用户管理,失主管理,寻物启示管理,拾…

视频——教学篇——拍摄和剪辑

文章目录 拍摄与录制。如何提升音质?如何提升画质?一、提升视频呈现的重点1.音质在很大程度上优先于画质2.在音质层面,环境可能比设备好坏更重要。3.提升视频画面方面,打光比买更好的相机更重要。4.画面的构图不如分镜的节奏来的重…

在线绘制带颜色标注的大脑脑区图

导读:大脑是人体最为复杂的器官之一,由多个功能特化的脑区构成。每个脑区承担着特定的生理和认知功能。通过应用定量数据映射技术,将数值以色彩编码的形式呈现于各个脑区,可以显著增强对不同脑区定量信息的视觉识别和理解。 《bio…

第十九周机器学习笔记:GAN的数学理论知识与实际应用的操作

第十九周周报 摘要Abstratc一、机器学习——GAN Basic Theory1. Maximum Likelihood Estimation2. 复习训练GAN的过程3. Objective function与JS散度相关性推导4. GAN的实际做法 总结 摘要 本周周报主要围绕生成对抗网络(GAN)的基础知识和理论进行深入探…

刷题小记11:栈队列

包括单调栈和优先队列 232. 用栈实现队列 用栈实现队列 两个栈 入队:向入队栈中加入元素 出队:从出队栈中出栈元素,如果出队栈为空,将入队栈所有元素入栈到出队栈。这样顺序就对了 225. 用队列实现栈 用队列实现栈 优化 …

【Qt问题】解决 Cannot retrieve debugging output

【Qt问题】解决 Cannot retrieve debugging output Chapter1 【Qt问题】解决 Cannot retrieve debugging output方案1 关闭其他Qt工程实例(等于没说)方案2 在PRO文件中,加上CONFIG console Chapter1 【Qt问题】解决 Cannot retrieve debuggi…

git 提交代码流程

1. 公-->私-->本-->私-->公 缺点:多了一个步骤,就多了一次申请时间,首先在公仓申请合并到私仓,私仓同意合并,获取到公仓最新版本; 优点:不容易污染公仓 2. 公-->本-->私--&…