- 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://www.bubuko.com/infodetail-2851520.html