Postgres中表和元组的组织方式
PG version 9.5.3
PG中四种堆文件:
- 普通堆
- 临时堆
- 序列堆
- TOAST表
PageHeaderData长度为24(截图为8.4版本,20字节)个字节包含的内容如下:
- 空闲空间的起始和结束位置
- Special space的开始位置
- 项指针开始的位置
- 标志信息,是否存在空闲指针,是否所以元组可见
Linp是ItemIdData类型的数组
Lp_off是元组在文件中的偏移量
Lp_flags是元组的状态
Lp_len是元组的长度
Freespace是值未分配的空间,新插入的元组和对应的linp都会从这部分空间来分配
linp从freespace的头开始分配,新的元组从尾部开始分配
Special space
特殊的空间,主要是用来存储跟索引方法相关的数据,不同的索引方法在special space中
存放的不同的数据。
TUPLE
元组中不单单存储元组数据还存储了元组的头数据(HeapTupleHeaderData)
- t_choice具有2个成员的联合类型:
- T_heap 用于记录对元组执行插入/删除操作事物ID和命令ID,这些信息主要用于并发
控制是检查元组对事物的可见性
-
- T_datum一个新的元组在内存中形成的时候,我们不关心事物的可见性,因此在t_choice中需要用DatumTupleFields结构来记录元组的长度等信息,把内存的数据写入到表文件的时候,需要在元组中记录事物和命令ID,因此会把t_choice所占的内存转换成HeapTupleFields结构并且填充响应数据后再进行元组的插入。
- T_ctid用于记录当前元组或者新元组的物理位置,块号和块内偏移量,例如(0,1)第一个块内的第一个linp,若tuple被跟新,那么就记录新版本的物理位置
- T_infomask2使用其低11位标识当前tuple的attribute的个数,其他位用于HOT以及tuple可见性的标志位
- T_infomask用于标识tuple当前的状态,比如是否有OID,是否空的字段,t_infomask每一位代表一种状态,总共16种。
T_hoff标识tuple中的头的大小
T_bits[]用来标记该tuple中那些字段是空的