一. 前言
在openGauss中如果表有索引信息,查询的谓词条件中又包含索引列,openGauss支持通过索引信息快速拿到需要访问元组的位置信息,然后直接到该位置上取出元组数据,称之为回表查询。如下所示,利用索引索引列id=55快速找到t111上对应元组的位置信息,然后通过位置信息拿到id为55的元组中所有列的数据。

本文通过走读openGauss的代码了解openGauss是怎样实现回表查询的。
二. Insert处理
要想实现能快速回表,那么insert时需要保存索引和物理表的位置信息关系。openGauss的insert的入口在ExecInsertT中,保存索引列与元组的位置信息代码流程如下所示:
ExecInsertT
pTSelf = tableam_tops_get_t_self(result_relation_desc, tuple) // pTSelf保存着的是索引对应物理表元组位置信息
relation->rd_tam_ops->tops_get_t_self(tup);
HeapamTopsGetTSelf
return tup->t_self // 元组的物理表位置信息,即元组的t_self
ExecInsertIndexTuples
index_insert(..values, tupleid...) // value为索引值,tupleid为对应物理表中元组位置信息
btinsert_internal
_bt_doinsert

最低0.47元/天 解锁文章
1478

被折叠的 条评论
为什么被折叠?



