2021SC@SDUSC
本篇博客主要讲解Gin索引创建和插入的过程和相关的数据结构,由于过程较为复杂,会在下一篇博客会具体分析相关函数。
目录
GIN创建
创建过程
GIN索引的创建过程是从基表中依次取出基表元组,然后从基表元组构建出若干个Entry和它的Pointing List,然后插入到GIN索引结构中。实际中,GIN索引的创建函数不会实时的插入Entry,而是建立类似于蓄积池的东西,先将Entry放入蓄积池,当蓄积池填充到一定程度时才会将其中缓存的Entry依次插入到GIN索引中。
主要数据结构
GinBuildState
GinBuildState记录了创建过程的状态
typedef struct
{
GinState ginstate;//GIN索引的基本信息,存放实现的五个函数
double indtuples;//索引元组总数
GinStatsData buildStats;//计划使用的数据
MemoryContext tmpCtx;//创建过程使用的临时内存上下文
MemoryContext funcCtx;//创建过程中进行函数调用时的内存上下文
BuildAccumulator accum;//蓄积池缓存Entry
} GinBuildState;
BuildAccumulator
该数据结构为“蓄积池”的相关数据结构
typedef struct
{
GinState *ginstate;//GIN索引的信息
Size allocatedMemory;//当前存放Entry的数量
GinEntryAccumulator *entryallocator;//内存分配器,为蓄积池分配内存
uint32 eas_used;//记录树的最大深度
RBTree *tree;//指向蓄积池中Entry构成的树
RBTreeIterator tree_walk;
} BuildAccumulator;
GinEntryAccumulator
每一个Entry都有一个该数据结构GinEntryAccumulator,它们在蓄积池内排成了一棵排序二叉树。