postgresql tuple介绍

2023-10-28

文章目录

  • 前言
  • tuple结构
  • tupleheader介绍
  • tuple组装
  • 结尾

前言

本文是基于postgresql 14的代码进行分析解读,演示是在centos8系统上进行。


1、tuple结构

 

	 +---------------------+---------------+----------------+
	 | HeapTupleHeaderData |  nulls bitmap | padding        |
	 +------------+--------+---------------+----------------+
	 | object ID  |  value1 value2 value3 ...               |
	 +------------+-----------------------------------------+
  

  数据表里看到的每一行数据,在page中是以tuple的形式存储,tuple的结构有:

 

(1) HeapTupleHeaderData 

(2)nulls bitmap ; 这是个可选项,当t_infomaskHEAP_HASNULL标志的话,这个数组就会有值;

(3) padding ;  前面null bitmap的长度不确定,为了后面数据能对齐,这里对HeapTupleHeaderData+nulls bitmap 字节对齐,这里会有留空。

(4) OID值,这是个可选项,当t_infomask有HEAP_HASOID_OLD时,会有此值;

(5)用户数据;也就是各列的数据;

 

 

2、tupleheader介绍

 

struct HeapTupleHeaderData

{

    union

    {

        HeapTupleFields t_heap;

        DatumTupleFields t_datum;

    }           t_choice;

    ItemPointerData t_ctid;     /* current TID of this or newer tuple (or a

                                 * speculative insertion token) */

    /* Fields below here must match MinimalTupleData! */

#define FIELDNO_HEAPTUPLEHEADERDATA_INFOMASK2 2

    uint16      t_infomask2;    /* number of attributes + various flags */

#define FIELDNO_HEAPTUPLEHEADERDATA_INFOMASK 3

    uint16      t_infomask;     /* various flag bits, see below */

#define FIELDNO_HEAPTUPLEHEADERDATA_HOFF 4

    uint8       t_hoff;         /* sizeof header incl. bitmap, padding */

    /* ^ - 23 bytes - ^ */

#define FIELDNO_HEAPTUPLEHEADERDATA_BITS 5

    bits8       t_bits[FLEXIBLE_ARRAY_MEMBER];  /* bitmap of NULLs */

    /* MORE DATA FOLLOWS AT END OF STRUCT */

};

  • 字段说明

(1) t_choice

HeapTupleFields 结构和 DatumTupleFields 结构组成的联合体,分别在tuple构建和tuplepage中两种情况下选择使用,又不能同时存在。

 

  • t_datum

当一个tuple在内 存中构建时,需要填充这个结构体。这时候还不需要可见性判断和并发控制的信息。

结构说明:

typedef struct DatumTupleFields

{

    int32       datum_len_;     /* varlena header (do not touch directly!) */

    int32       datum_typmod;   /* -1, or identifier of a record type */

    Oid         datum_typeid;   /* composite type OID, or RECORDOID */

    /*

     * datum_typeid cannot be a domain over composite, only plain composite,

     * even if the datum is meant as a value of a domain-over-composite type.

     * This is in line with the general principle that CoerceToDomain does not

     * change the physical representation of the base type value.

     *

     * Note: field ordering is chosen with thought that Oid might someday

     * widen to 64 bits.

     */

} DatumTupleFields;

 

 

  • t_heap

当把tuple加入到表的page中时,就必须填充这个结构体。将DatumTupleFields直接强转成HeapTupleFields结构来使用。

 

结构说明:

typedef struct HeapTupleFields

{

    TransactionId t_xmin;       /* inserting xact ID */

    TransactionId t_xmax;       /* deleting or locking xact ID */

    union

    {

        CommandId   t_cid;      /* inserting or deleting command ID, or both */

        TransactionId t_xvac;   /* old-style VACUUM FULL xact ID */

    }           t_field3;

} HeapTupleFields;

3、tuple组装

在insert/update时都会组装一个新的tuple,然后找到一个剩余空间足够的page,加到里面。当然寻找空间足够的page有一定策略,这个后面再讲。

  • 新建一个tuple

HeapTuple

heap_form_tuple(TupleDesc tupleDescriptor,

                Datum *values,

                bool *isnull);

在这个接口中计算tuple的len,包括tupleheader+各属性列的值的大小,

另外len还需要包括HeapTupleData结构体的大小,该结构体记录了 行指针数据和tuple的数据,以及他们的总长度;

 

typedef struct HeapTupleData

{

    uint32      t_len;          /* length of *t_data */

    ItemPointerData t_self;     /* SelfItemPointer */

    Oid         t_tableOid;     /* table the tuple came from */

#define FIELDNO_HEAPTUPLEDATA_DATA 3

    HeapTupleHeader t_data;     /* -> tuple header and data */

} HeapTupleData;

 

然后t_datat_choice.t_datum会被赋值,长度取值为tuple长度向左移2位;

  • tuple操作

tupleheadert_choice.t_datum赋值操作

HeapTupleHeaderSetDatumLength(td, len);

HeapTupleHeaderSetTypeId(td, tupleDescriptor->tdtypeid);

HeapTupleHeaderSetTypMod(td, tupleDescriptor->tdtypmod);

  • 属性列个数限制

#define MaxTupleAttributeNumber 1664    /* 8 * 208 */

在内存中构建tuple时会判断是否超过这个上限

#define MaxHeapAttributeNumber  1600    /* 8 * 200 */

这里最大1600个列,当列的字段长时会小于这个数字;这个数字是留有一定余量。


结尾

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

注:未经同意,不得转载!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

postgresql tuple介绍 的相关文章

  • Postgresql:SERIAL 在约束 INSERT 失败时递增

    有一个像这样的简单表结构 CREATE TABLE test id INT PRIMARY KEY sid SERIAL 我注意到如果我尝试插入一行但它未通过约束测试 即主键约束 SERIAL计数器无论如何都会增加 所以下一次成功插入 si
  • 在 vimrc 中切换匹配

    我的 vimrc 文件中有以下几行 hi ExtraWhitespace cterm NONE ctermbg green ctermfg green guibg green guifg green match ExtraWhitespac
  • PostgreSQL安装错误——无法分配内存

    我正在尝试从 sqlite3 切换到 PostgreSQL 以在 Rails 中进行开发 这样我就不会遇到任何 heroku 问题 我遵循了heroku和链接到的Railscast上给出的建议 但是在brew安装postgresql后遇到了
  • Mac psql/readline - 库未加载

    我正在 Mac Sierra 10 12 3 上工作 并且尝试通过以下方式访问 PostgreSQL 数据库psql命令 但它引发了错误 dyld Library not loaded usr local opt readline lib
  • 当在 python linux 中执行命令 os.system() 时,在 python 中给出响应 yes/no

    考虑一个像这样的命令 yum install boto 当我在终端中执行时 要继续 会询问我是 否 我可以像这样用 python 回应它吗 os system yum install boto Next Yes 将通过相同的 python
  • 如何使用 nohup 获取正在运行的程序列表

    我正在通过 SSH 连接访问运行 CentOS linux 发行版 的服务器 由于我无法始终保持登录状态 因此我使用 nohup command 来运行我的程序 我找不到如何获取我开始使用 nohup 的所有程序的列表 工作 只有在我注销之
  • 如何为 MySQL 和 Postgres 编写不区分大小写的查询?

    我在本地运行 MySQL 数据库进行开发 但部署到使用 Postgres 的 Heroku Heroku 处理几乎所有事情 但我不区分大小写的 Like 语句变得区分大小写 我可以使用 iLike 语句 但我的本地 MySQL 数据库无法处
  • REASSIGN OWNED BY 为 1 个指定数据库

    我想使用以下命令更改一个特定数据库中所有表的所有者 REASSIGN OWNED BY postgres TO myuser 但它显示 ERROR cannot reassign ownership of objects owned by
  • 如何将命令输出作为多个参数传递给另一个命令

    我想将命令的每个输出作为多个参数传递给第二个命令 例如 grep pattern input returns file1 file2 file3 我想复制这些输出 例如 cp file1 file1 bac cp file2 file2 b
  • 用于 e NetworkManager VPN 连接的 dbus 信号处理程序

    我需要开发一些在建立 VPN 连接时执行的 python 代码 VPN 由 NetworkManager 控制 我试图弄清楚如何为此使用 NM DBUS 事件 使用 dbus monitor system 我能够识别连接信号 signal
  • 使用连接查询检索行

    我有两张这样的桌子 A B col1 col2 col1 col2 一个表包含 300k 行 B表包含400k行 如果表 A 的 col1 与表 B 的 col1 匹配 我需要计算它 我写了一个这样的查询 select count dist
  • 打印 STDOUT/STDERR 并将它们写入 Bash 中的文件?

    有没有办法让 Bash 将 STDOUT STDERR 重定向到文件 但仍然将它们打印到终端 这会将 STDOUT 和 STDERR 重定向到同一个文件 some command 2 gt 1 tee file log Example to
  • EULA 接受 Bash 脚本

    我有一个尝试安装垃圾箱的脚本 除了 bin 在 more 中打开 EULA 之外 一切正常 在脚本再次开始并自行完成安装之前 您必须手动 ctrl c 退出此 more 实例 因为这更多的是逃离 shell 所以脚本在打开后不知道要运行什么
  • 在同一个表上组合两个 SQL SELECT 语句

    我想结合这两个 SQL 查询 SELECT FROM Contracts WHERE productType RINsell AND clearTime IS NULL AND holdTime IS NOT NULL ORDER BY g
  • 使用 .htaccess 启用 PHP 短标签

    我在自己的 Centos 服务器上设置了 Apache 并具有多个虚拟 Web 服务器 并且我希望仅为位于以下位置的其中一个 Web 服务器启用 PHP 短标记 var www ostickets html 我可以通过添加成功启用短标签sh
  • Flex 的远程版本误解了我的规则

    我使用 flex 和 bison 编写了一个小汇编程序 可以在我的机器 ubuntu 10 10 上构建并运行正常 现在其他人正在尝试在 arch linux 上构建它 并且他们安装的 flex 产生了不同的 lex yy c 这是不匹配的
  • PHP 日志文件颜色

    我正在编写一个 PHP 日志文件类 但我想为写入文件的行添加颜色 我遇到的问题是颜色也会改变终端的颜色 我想要实现的是仅更改写入日志文件的行的颜色 class logClass extends Singleton private funct
  • 使用 hcitool 扫描低功耗蓝牙?

    当我运行此命令时 BLE 设备扫描仅持续 5 秒 sudo timeout 5s hcitool i hci0 lescan 输出显示在终端屏幕中 但是 当我将输出重定向到文件以保存广告设备的地址时 每次运行该命令时 我都会发现该文件是空的
  • 在 MacO 和 Linux 上安装 win32com [重复]

    这个问题在这里已经有答案了 我的问题很简单 我可以安装吗win32com蟒蛇API pywin32特别是 在非 Windows 操作系统上 我一直在Mac上尝试多个版本pip install pywin32 都失败了 下面是一个例子 如果你
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul

随机推荐

  • 浏览器手势识别原理

    以下内容转自 链接 https www zhihu com question 20607813 answer 1396981185 来源 知乎 Stroke 是作者的一款开源鼠标手势 支持复杂手势 对于这个问题 我觉得可以细分为这样两个子问
  • C/C++cmath库常用函数

    在一些计算题目中 我们常会用到求和 取绝对值以及求三角函数等代码 写出来需要耗费一番功夫 于是 C C 库中提供了一个包含各种计算函数的头文件 cmath库 C C 中的cmath头文件 C include
  • S_ISREG S_ISDIR 等几个常见的宏

    转自 http blog csdn net dssxk article details 6793370 S ISLNK st mode 是否是一个连接 S ISREG st mode 是否是一个常规文件 S ISDIR st mode 是否
  • FFT将时域信号变换到频域里面的一些重要知识点记录

    一 FFT是离散傅立叶变换 采样得到的数字信号 就可以做FFT变换了 N个采样点 经过FFT之后 就可以得到N个点的FFT结果 为了方便进行FFT运算 通常N取2的整数次方 假设采样频率为Fs 信号频率F 采样点数为N 那么FFT之后结果就
  • Spring容器IOC初始化过程---今天终于进行总结了

    一 老规矩 先比比点幺蛾子 作为一个经常使用Spring的后端程序员 小编很早就想彻底弄懂整个Spring框架了 但它整体是非常大的 所有继承图非常复杂 加上小编修行尚浅 显得力不从心 不过 男儿在世当立志 今天就先从Spring IOC容
  • 国民技术MCU开发之频率修改

    文章目录 前言 设置外部输入晶振频率 修改MCU时钟主频 修改系统时钟源 配置HCLK PCLK2和PCLK1 前言 本文以N32L403芯片为例 依赖库文件版本为 N32L40xxx V2 0 0 记录了国民MCU关于频率修改的位置和方法
  • 基于注解方式实现Spring Security忽略拦截

    文章目录 1 Spring Security忽略拦截配置 2 基于配置文件注入 2 1 添加配置 2 2 修改Spring Security配置类 2 3 测试 3 基于注解的方式过滤接口 3 1 添加忽略拦截注解 3 2 获取所有使用了
  • Adworld -give_you_flag

    Adworld give you flag 补齐二维码 扫描得出flag 已解码数据 1 位置 10 0 13 4 214 5 11 0 11 4 217 0 214 3 213 4 颜色正常 正像 版本 5 纠错等级 H 掩码 6 内容
  • 用于非线性多载波卫星信道的多输入多输出符号速率信号数字预失真器DPD(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据 文章 1 概述 文献来源 摘要 该文提出一种数字预
  • python中年月日,python日期和时间

    今天是第17天 在Python中通常用时间戳 时间字符串和元组三种方式表示 今天学习的是time和datetime常用时间和日期函数的用法 一 日期和时间的处理 1 时间戳 指1970年1月1日0时0分0秒起到现在的总毫秒数 gt gt g
  • C#Windows Service程序的创建安装与卸载

    C Windows Service程序的创建安装与卸载 一 开发环境 操作系统 Windows7x64 sp1 专业版 开发环境 Visual studio 2013 编程语言 C NET版本 NET Frmework 4 0 二 创建Wi
  • flink监控1---延时监控

    什么是延时监控 延时监控 简单理解监控算子到算子的延迟时间 记录算子间或者源流入到算子时间 监控系统健康以及调节 流式计算中处理延迟是一个非常重要的监控metric flink中通过开启配置 metrics latency interval
  • IDEA插件系列(111):JUnitGenerator V2.0插件——快速生成单元测试

    1 插件介绍 JUnitGenerator V2 0插件 该插件从右键单击 Generate 菜单生成 JUnit 测试 同时专注于 Java 类 可以使用提供的速度模板自定义单元测试输出代码 以根据原始类格式化代码 如果在已经存在的地方创
  • 504服务器无响应,什么是504网关超时错误(以及如何解决)?

    当试图加载网页的服务器没有及时从另一台服务器获得响应时 就会发生504网关超时错误 几乎总是错误是在网站本身上 您无能为力 但请稍后再试 不过 您可以尝试一些快速操作 504网关超时错误表示尝试为您加载页面的Web服务器没有从其请求信息的其
  • 计算机毕业设计Node.js+Vue基于的企业人事管理系统(程序+源码+LW+部署)

    该项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 欢迎交流 项目运行 环境配置 Node js Vscode Mysql5 7 HBuilderX Navicat11 Vue Express 项目技术 Express框架 No
  • ElementUI table表格列动态渲染

    文章目录 一 概述 二 实现 一 概述 一般写table时 列都是固定 现有业务需求 列是不固定的 根据api返回的数据 进行动态渲染 官方table示例 链接如下 https element eleme cn zh CN componen
  • mysql服务重启和关闭

    没有加环境变量 重启MySQL 服务的步骤 1 win R 打开 cmd 确定 2 切换到MySQL的bin目录
  • LeetCode--初级算法--实现strStr()

    实现strStr 实现 strStr 函数 给定一个 haystack 字符串和一个 needle 字符串 在 haystack 字符串中找出 needle 字符串出现的第一个位置 从0开始 如果不存在 则返回 1 示例 1 输入 hays
  • C++ std::vector指定位置插入

    使用vector 必须加上 include
  • postgresql tuple介绍

    文章目录 前言 tuple结构 tupleheader介绍 tuple组装 结尾 前言 本文是基于postgresql 14的代码进行分析解读 演示是在centos8系统上进行 1 tuple结构 HeapTupleHeaderData n