PostgreSQL存储引擎之heap tuple结构

struct HeapTupleHeaderData
{
    union
    {
        HeapTupleFields t_heap;
        DatumTupleFields t_datum;
    }t_choice;
    ItemPointerData t_ctid;//
    uint16      t_infomask2;    /* number of attributes + various flags */
    uint16      t_infomask;     /* various flag bits, see below */
    uint8       t_hoff;         /* sizeof header incl. bitmap, padding */
    bits8       t_bits[FLEXIBLE_ARRAY_MEMBER];  /* bitmap of NULLs */
};

t_choice是具有两个成员的联合类型:

? ? t_heap:用于记录对元组执行插入/删除操作的事务ID和命令ID,这些信息主要用于并发控制时检查元组对事务的可见性。

? ? t_datum:当一个新元组在内存中形成的时候,我们并不关心其事务可见性,因此在t_choice中只需用DatumTupleFields结构来记录元组的长度等信息。但在把该元组插入到表文件时,需要在元组头信息中记录插入该元组的事务和命令ID,故此时会把t_choice所占用的内存转换为HeapTupleFields结构并填充相应数据后再进行元组的插入。

t_ctid用于记录当前元组或者新元组的物理位置(block号及块内偏移量),若元组被更新(PostgreSQL对元组的更新采用的是标记删除旧版本元组并插入新版本元组的方式),则记录的是新版本元组的物理位置。

t_infomask2使用其低11位表示当前元组的属性个数,其他位则用于包括用于HOT技术及元组可见性的标志位。

t_infomask用于标识元组当前的状态,比如元组是否具有OID、是否有空属性等,t_infomask的每一位对应不同的状态,共16种状态。

t_hoff表示该元组头的大小。

_bits[]数组用于标识该元组哪些字段为空。

PostgreSQL中对于元组采用多版本技术存储,对元组的每个更新操作都会产生一个新版本,版本之间从老到新形成一条版本链(将旧版本的t_ctid字段指向下一个版本的位置即可)。

原文地址:http://blog.51cto.com/yanzongshuai/2318377

时间: 2024-11-04 08:21:24

PostgreSQL存储引擎之heap tuple结构的相关文章

InnoDB存储引擎介绍-(1)InnoDB存储引擎结构

首先以一张图简单展示 InnoDB 的存储引擎的体系架构. 从图中可见, InnoDB 存储引擎有多个内存块,这些内存块组成了一个大的内存池,主要负责如下工作: 维护所有进程/线程需要访问的多个内部数据结构 缓存磁盘上的数据, 方便快速读取, 同时在对磁盘文件修改之前进行缓存 重做日志(redo log)缓冲 后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最新数据;将已修改数据文件刷新到磁盘文件;保证数据库发生异常时 InnoDB 能恢复到正常运行 的状态 后台线程 In

20160924-1——mysql存储引擎

一.主要存储引擎 5.5以后的版本,默认存储引擎从myisam改成了innodb:线上推荐都用innodb 二.innodb存储引擎 (一)结构 INNODB存储引擎大致分三部分,图中已经(1)(2)(3)标出.至于MYSQL Server层暂不管它,就是SQL接口.解析器.优化器.缓冲池的那层组件. 上图中: (1)是缓存层,由一个大的innodb buffer pool和很多个其他小的内存组件组成,用来缓冲数据的,innodb的数据读取写入不是直接操作文件,而是从文件加载到缓存,在缓冲里做操

[转]MySQL性能调优与架构设计——第11章 常用存储引擎优化

第11章 常用存储引擎优化 前言: MySQL 提供的非常丰富的存储引擎种类供大家选择,有多种选择固然是好事,但是需要我们理解掌握的知识也会增加很多.每一种存储引擎都有各自的特长,也都存在一定的短处.如何将各种存储引擎在自己的应用环境中结合使用,扬长避短,也是一门不太简单的学问.本章选择最为常用的两种存储引擎进行针对性的优化建议,希望能够对读者朋友有一定的帮助. 11.1 MyI SAM存储引擎优化 我们知道,MyISAM存储引擎是MySQL最为古老的存储引擎之一,也是最为流行的存储引擎之一.对

MySQL性能调优与架构设计——第11章 常用存储引擎优化

第11章 常用存储引擎优化 前言: MySQL 提供的非常丰富的存储引擎种类供大家选择,有多种选择固然是好事,但是需要我们理解掌握的知识也会增加很多.每一种存储引擎都有各自的特长,也都存在一定的短处.如何将各种存储引擎在自己的应用环境中结合使用,扬长避短,也是一门不太简单的学问.本章选择最为常用的两种存储引擎进行针对性的优化建议,希望能够对读者朋友有一定的帮助. 11.1 MyI SAM存储引擎优化 我们知道,MyISAM存储引擎是MySQL最为古老的存储引擎之一,也是最为流行的存储引擎之一.对

重新学习MySQL数据库3:Mysql存储引擎与数据存储原理

重新学习Mysql数据库3:Mysql存储引擎与数据存储原理 数据库的定义 很多开发者在最开始时其实都对数据库有一个比较模糊的认识,觉得数据库就是一堆数据的集合,但是实际却比这复杂的多,数据库领域中有两个词非常容易混淆,也就是数据库和实例: 数据库:物理操作文件系统或其他形式文件类型的集合: 实例:MySQL 数据库由后台线程以及一个共享内存区组成: 对于数据库和实例的定义都来自于 MySQL 技术内幕:InnoDB 存储引擎 一书,想要了解 InnoDB 存储引擎的读者可以阅读这本书籍. 数据

MySQL Merge存储引擎

Merge存储引擎同意将一组使用MyISAM存储引擎的而且表结构同样(即每张表的字段顺序.字段名称.字段类型.索引定义的顺序及其定义的方式必须同样)的数据表合并为一个表,方便了数据的查询. 如果有log_2004.log_2005.log_2006.log_2007 这四张日志记录表,其数据各自是每一年的数据,表结构例如以下(YY代表年份): CREATE TABLE log_YY ( dt DATETIME NOT NULL, info VARCHAR(100) NOT NULL, INDEX

MySQL内核:InnoDB存储引擎 卷1

MySQL内核:InnoDB存储引擎卷1(MySQL领域Oracle ACE专家力作,众多MySQL Oracle ACE力捧,深入MySQL数据库内核源码分析,InnoDB内核开发与优化必备宝典) 姜承尧 蒋鸿翔 饶珑辉 温正湖 著   ISBN 978-7-121-22908-4 2014年5月出版 定价:69.00元 360页 16开 编辑推荐 预售前100位读者送MySQL 5.6 InnoDB存储引擎的架构图 l  <高性能MySQL>配套深度阅读数据库内核解析篇 l  网易资深数据

小贝_mysql 常见存储引擎区别

存储引擎区别 简要: 1.存储引擎 2.myisam与innodb区别 一.存储引擎 1.什么是存储引擎 通俗地讲就是存储和管理数据的方式 形象例子: 某处地方的自行车管理员:李某,张某.每天都有很多人来存取自行车.李某的管理方式是: 车主自行存放,李某也不记录对方存的是什么车.取车时则要交管理费.也不检查取的是否是对方自己的车.相反,张某,则在车主存放车时,记录存放人的特征以及对应车的信息.当人来取车时,张某还要小心核对,人与车的特征是否对应. 从上述例子可知: a.从效率的角度来看: 李某比

Mysql 性能优化3 如何选择存储引擎

Mysql 使用 插件式存储引擎 Mysql 体系结构 mysql服务层 存储引擎层 都属于存储引擎                            MyISAM 存储引擎    frm 是记录结构的, MYD和 MYI 是MyISAM 特有的   例    表级锁,对数据进行修改时需要全表加锁.读取时也是需要家共享锁.对读写操作并发性不是很好,但是只读的话不怎么影响,共享锁不阻塞共享锁 支持全文索引. 支持text,blob,前500个字符的前缀索引. 如果是只读表的话,就是没有修改操作