文章目录

  • 前言
  • 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_infomask有HEAP_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构建和tuple在page中两种情况下选择使用,又不能同时存在。

  • 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_data的 t_choice.t_datum会被赋值,长度取值为tuple长度向左移2位;

  • tuple操作

给 tupleheader中t_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
如有错误或者疏漏欢迎指出,互相学习。

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

postgresql tuple介绍相关推荐

  1. PostgreSQL索引介绍

    梦中彩虹 博客园 首页 新随笔 联系 管理 随笔 - 131  文章 - 1  评论 - 14 PostgreSQL索引介绍 INDEX 索引是增强数据库性能的常用方法.索引使得数据库在查找和检索数据 ...

  2. PostgreSQL 分区表, pg_pathman ,PostgreSQL 10介绍及性能对比(转载)

    转载自:https://my.oschina.net/yonj1e/blog/868402 PostgreSQL 分区表, pg_pathman ,PostgreSQL 10介绍及性能对比 原 yon ...

  3. postgresql基本介绍以及部署使用

    postgresql基本介绍以及部署使用 1. 基本介绍 1.1 基本信息 1.2 优势 2. 对比mysql和oracle 2.1 Postgresql VS Oracle 2.2 Postgres ...

  4. PostgreSQL · 特性介绍 · 全文搜索介绍

    背景 在日常的数据处理中,我们经常会有这样的需求:从一个文本中寻找某个字符串(比如某个单词). 对这个需求,我们可以用类似这样的SQL完成:SELECT * FROM tbl WHERE text L ...

  5. Java元组Tuple介绍与使用

    一.元组介绍 仅仅一次方法调用就可以返回多个对象,你应该经常需要这样的功能吧.可以return语句只允许返回单个对(可能有人说返回一个集合就可以了,请记住,一个集合也只是一个对象而已)因此,解决办法就 ...

  6. java元组_Java元组Tuple介绍与使用

    一.元组介绍 仅仅一次方法调用就可以返回多个对象,你应该经常需要这样的功能吧.可以return语句只允许返回单个对(可能有人说返回一个集合就可以了,请记住,一个集合也只是一个对象而已)因此,解决办法就 ...

  7. Postgresql数据库介绍4——使用

    SQL语句( The SQL Language) 本章描述PostgreSQL中的 SQL 的语法. 我们开始描述SQL的主要语法,这些内容是理解随后各章的基础,在那些章里面将详细介绍 SQL 命令如 ...

  8. Postgresql数据库介绍10——使用

    索引(Indexes) Indexes are a common way to enhance database performance. An index allows the database s ...

  9. Postgresql数据库介绍

    文章目录 一.数据库介绍 1.数据库DB引擎排行榜 2.数据库的主要优势 一.数据库介绍 1.数据库DB引擎排行榜 当前数据库的使用情况 https://db-engines.com/en/ranki ...

最新文章

  1. 字段定义_两大高招逐浪CMS中定义省地市县三级字段显示方式
  2. linux 使用jstack_案例解析:线程池使用不当导致的系统崩溃
  3. angular 绑定自定义属性_Angular2实现自定义双向绑定属性
  4. Jerry带您了解Restful ABAP Programming模型系列之三:云端ABAP应用调试
  5. Android开发之高德地图定位成功返回的定位信息
  6. 2018蓝桥杯省赛---java---B---8(日志统计)
  7. 网管型工业交换机如何创建网络冗余
  8. Activiti 监听器的配置使用
  9. linux下升级zookeeper
  10. 解决css引用字体跨域问题
  11. 【干货】推荐技术分享-多业务融合推荐实践与思考.pdf(附50页ppt下载链接)
  12. kubernetes apiserver认证 1
  13. Unity3D基础15:触发器
  14. 软考计算机硬件工程师考试大纲,2016年软考信息安全工程师考试大纲
  15. 74LS138设计一位二进制全减器
  16. 软件开发成本估算方法
  17. Cardhop for Mac(通讯录管理工具)
  18. Android 项目上线流程总结
  19. 笔记本vmware利用无线网卡上网设置
  20. 服务器传奇网站搭建修改教程,传奇架设教程如何修改爆率

热门文章

  1. Vmware虚拟机安装Ubuntu镜像
  2. Oracle快速批量导入数据
  3. 2018年度总结-修行在路上
  4. 【Dex-Net 2.0】论文精度:Deep Learning to Plan Robust Grasps with Synthetic Point Clouds and Analytic Grasp
  5. matplotlib.pyplot / plt trick
  6. 这只是一个有关于安全系统的基本介绍
  7. 欧盟数字市场负责人:大科技公司垄断令人担忧
  8. 初学者的购买指南,蓝牙麦克风
  9. 关于学习生活记录的感想总结
  10. Elasticsearch01