存储引擎源码解析 | 磁盘引擎(9)
4. 多版本索引
在openGauss中实现了多版本索引ubtree,是专用于ustore的B-Tree索引变种,相比原有的B-Tree索引有如下差异点。
(1) 支持索引数据的多版本管理及可见性检查,能够自主鉴别旧版本元组并进行回收,同时索引层的可见性检查使得索引扫描(Index Scan)及仅索引扫描(Index Only Scan)性能有所提升。
(2) 在索引插入操作之外,增加了索引删除操作,用于对被删除或修改的元组对应的索引元组进行标记。
(3) 索引按照key + TID的顺序排列,索引列相同的元组按照对应元组的TID作为第二关键字进行排序。
(4) 添加新的可选页面分裂策略“insertpt”。
ubtree实现了索引访问接口所要求的全部接口,如表4-23所示:
此外,还实现了新增的的索引删除函数UBTreeDelete。
1) 索引页面组织
多版本索引层次结构与B-Tree索引基本相同,非叶子节点与B-Tree索引保持一致,仅页尾的Special字段有所不同。ubtree中的Special字段UBTPageOpaqueDataInternal如下所示:
……
/* 以上部分与BTPageOpaqueDataInternal一致 */
TransactionId last_delete_xid; /* 记录页面上最后一次删除事务的 XID */
TransactionId xid_base; /* 页面上的 xid-base */
int16 activeTupleCount; /* 页面上活跃元组计数 */
} UBTPageOpaqueDataInternal;
typedef UBTPageOpaqueDataInternal* UBTPageOpaqueInternal;