Postgres中表和元组的组织方式

时间:2021-11-03 16:19:27

PG version 9.5.3

PG中四种堆文件:

  • 普通堆
  • 临时堆
  • 序列堆
  • TOAST表

Postgres中表和元组的组织方式

PageHeaderData长度为24(截图为8.4版本,20字节)个字节包含的内容如下:

  • 空闲空间的起始和结束位置
  • Special space的开始位置
  • 项指针开始的位置
  • 标志信息,是否存在空闲指针,是否所以元组可见

Linp是ItemIdData类型的数组

Postgres中表和元组的组织方式

Lp_off是元组在文件中的偏移量

Lp_flags是元组的状态

Postgres中表和元组的组织方式

Lp_len是元组的长度

Freespace是值未分配的空间,新插入的元组和对应的linp都会从这部分空间来分配

linp从freespace的头开始分配,新的元组从尾部开始分配

Special space

特殊的空间,主要是用来存储跟索引方法相关的数据,不同的索引方法在special space中

存放的不同的数据。

TUPLE

元组中不单单存储元组数据还存储了元组的头数据(HeapTupleHeaderData)

Postgres中表和元组的组织方式

  1. t_choice具有2个成员的联合类型:
  • T_heap 用于记录对元组执行插入/删除操作事物ID和命令ID,这些信息主要用于并发

      控制是检查元组对事物的可见性

    • T_datum一个新的元组在内存中形成的时候,我们不关心事物的可见性,因此在t_choice中需要用DatumTupleFields结构来记录元组的长度等信息,把内存的数据写入到表文件的时候,需要在元组中记录事物和命令ID,因此会把t_choice所占的内存转换成HeapTupleFields结构并且填充响应数据后再进行元组的插入。
  1. T_ctid用于记录当前元组或者新元组的物理位置,块号和块内偏移量,例如(0,1)第一个块内的第一个linp,若tuple被跟新,那么就记录新版本的物理位置
  2. T_infomask2使用其低11位标识当前tuple的attribute的个数,其他位用于HOT以及tuple可见性的标志位
  3. T_infomask用于标识tuple当前的状态,比如是否有OID,是否空的字段,t_infomask每一位代表一种状态,总共16种。

Postgres中表和元组的组织方式

T_hoff标识tuple中的头的大小

T_bits[]用来标记该tuple中那些字段是空的