Postgres中表和元组的组织方式

PG version 9.5.3

 

PG中四种堆文件:

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

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

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

 

LinpItemIdData类型的数组

 

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

Lp_flags是元组的状态

 

Lp_len是元组的长度

 

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

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

 

Special space

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

存放的不同的数据。

 

TUPLE

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

 

  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种。

 

T_hoff标识tuple中的头的大小

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

 

 

posted @ 2017-02-17 23:51  Li.Sang  阅读(1710)  评论(0编辑  收藏  举报