存储引擎源码解析 | 磁盘引擎(3)
4.2.3 astore
- astore整体框架
astore整体框架如图4-2所示。如上所述,作为行存储子格式之一,astore需要实现自己的堆表存取(访存)管理接口、堆表页面结构、堆表元组结构、元组多版本机制,以及空闲空间管理和回收机制。
- astore堆表页面元组结构
本节介绍astore堆表的页面和元组结构。
所谓堆表,是指元组无序存储,数据按照“先来后到”的方式存储在页面中的空闲位置。作为对比,在索引表中,元组根据索引键键值的排序,在页面内部有序存储,且各个页面之间在逻辑上也是有序存储的。堆表存储数据主体,索引表仅存储索引键键值以及对应的、完整元组的物理位置(即完整元组在堆表中的页面号和页内偏移)。
1) astore堆表元组结构
astore堆表元组结构的定义部分代码如下:
ShortTransactionId t_xmin; /* 插入元组事务的事务号 */
ShortTransactionId t_xmax; /* 删除元组事务的事务号 */
union {
CommandId t_cid; /* 插入或删除命令在事务中的命令号 */
ShortTransactionId t_xvac;
} t_field3;
} HeapTupleFields;
typedef struct HeapTupleHeaderData {
union {
HeapTupleFields t_heap;
DatumTupleFields t_datum;
} t_choice;
ItemPointerData t_ctid; /* 当前元组或更新后元组的行号 */
uint16 t_infomask2; /* 字段个数和标记位 */
uint16 t_infomask; /* 标记位 */
uint8 t_hoff; /* 包括NULL字段位图、对齐填充在内的元组头部大小 */
bits8 t_bits[FLEXIBLE_ARRAY_MEMBER]; /* NULL字段位图 */
/* 实际元组数据再该元组头部结构体之后,距离元组头部处偏移t_hoff字节 */
} HeapTupleHeaderData;