当前位置: 首页 > news >正文

postgressql——Tuple学习(2)

Tuple含义

  1. 作用
    PG并没有像Oracle那样的undo来存放旧数据,而且PG没有真正意义上的delete,而是将旧版本直接存放于relation文件中,也就是成为了dead tuple。我们可以理解成“过期的数据”
  2. 含义
    tuple就相当于一个存储数据的小容器,它包含了两个及以上的components。可能会与Oracle中的row类似,但是这二者之间并不能划等号。
  3. 结构
	 +---------------------+---------------+----------------+| HeapTupleHeaderData |  nulls bitmap | padding        |+------------+--------+---------------+----------------+| object ID  |  value1 value2 value3 ...               |+------------+-----------------------------------------+

(1) HeapTupleHeaderData
(2)nulls bitmap
这是个可选项,当t_infomask有HEAP_HASNULL标志的话,这个数组就会有值
(3) padding
前面null bitmap的长度不确定,为了后面数据能对齐,这里对HeapTupleHeaderData+nulls bitmap 字节对齐,这里会有留空。
(4) OID值,这是个可选项,当t_infomask有HEAP_HASOID_OLD时,会有此值
(5)用户数据,就是各列的数据;

Tuple的实践

主要函数为如下五个:
step1. ExecInsert
step2. ExecMaterializeSlot
step3. ExecCopySlotTuple——拼装入口
step4. heap_form_tuple——根据values和isnull拼装tuple
step5. heap_fill_tuple——根据desc把数据填到正确的位置

执行器会把tuple包装成tuple table slot来处理,相当于给HeapTuple包装了一层:TupleTableSlots

代码里会见到很多tts = TupleTableSlots,结构如下:

typedef struct TupleTableSlot
{NodeTag		type;bool		tts_isempty;	/* true = slot is empty */bool		tts_shouldFree; /* should pfree tts_tuple? */bool		tts_shouldFreeMin;	/* should pfree tts_mintuple? */bool		tts_slow;		/* saved state for slot_deform_tuple */HeapTuple	tts_tuple;		/* physical tuple, or NULL if virtual */TupleDesc	tts_tupleDescriptor;	/* slot's tuple descriptor */MemoryContext tts_mcxt;		/* slot itself is in this context */Buffer		tts_buffer;		/* tuple's buffer, or InvalidBuffer */int			tts_nvalid;		/* # of valid values in tts_values */Datum	   *tts_values;		/* current per-attribute values */bool	   *tts_isnull;		/* current per-attribute isnull flags */MinimalTuple tts_mintuple;	/* minimal tuple, or NULL if none */HeapTupleData tts_minhdr;	/* workspace for minimal-tuple-only case */long		tts_off;		/* saved state for slot_deform_tuple */
} TupleTableSlot;

于普通tuple来说,ExecInsert的第一件事就是“物化”Tuple Slot:
【slot】 ----组装----> 【materialized slot】
在这里插入图片描述

http://www.lryc.cn/news/359697.html

相关文章:

  • Linux日志管理
  • 【社区投稿】给 NdArray 装上 CUDA 的轮子
  • Linux|Linux常用命令合集(一)
  • RTPS协议之Behavior Module
  • Socket网络通讯入门(一)
  • 第十五课,海龟画图:抬笔与落笔函数、画曲线函数
  • 【机器学习】让大模型变得更聪明
  • 5.26机器人基础-DH参数 正解
  • Vue3项目练习详细步骤(第五部分:用户模块的功能)
  • 测试onlyoffice在线预览文件功能
  • Day57 每日温度 + 下一个更大元素Ⅰ
  • nuxt3 api如何透传(不引第3方库)
  • list常用接口模拟实现
  • 前端工程化工具系列(三) —— Stylelint(v16.6.1):CSS/SCSS 代码质量工具
  • crossover mac好用吗 CrossOver Mac怎么下载 Mac用crossover损害电脑吗
  • PHP模块pdo_sqlite.so: undefined symbol: sqlite3_column_table_name
  • 卷积神经网络-奥特曼识别
  • VB.net进行CAD二次开发(四)
  • 3步轻松月入过万,APP广告新模式大揭秘!
  • java项目之智能家居系统源码(springboot+vue+mysql)
  • 前端 JS 经典:读取文件原始内容
  • 汇编概论和实践
  • 铁塔基站用能监控能效解决方案
  • keepalived安装文档
  • Spring Security
  • vue中大屏可视化适配所有屏幕大小
  • AI大模型探索之路-实战篇12: 构建互动式Agent智能数据分析平台:实现多轮对话控制
  • 深入理解文件系统和日志分析
  • vue+vant移动端显示table表格加横向滚动条
  • webserver服务器从零搭建到上线(八)|EpollPoller事件分发器类