postgreSQL源码分析——索引的建立与使用——GIN索引(2)

这篇博客详细解析了PostgreSQL中GIN索引的创建和插入过程,包括GinBuildState、BuildAccumulator和GinEntryAccumulator等关键数据结构。在创建过程中,数据先积累在蓄积池,达到一定量后批量插入。插入操作涉及GinBtreeData结构,用于查找、插入和分裂操作。GinBtreeStack则记录查找路径,用于节点分裂后的回溯调整。
摘要由CSDN通过智能技术生成

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,它们在蓄积池内排成了一棵排序二叉树。


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值