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

本文深入探讨了PostgreSQL的GIN索引,详细介绍了索引创建的过程,包括ginbuild函数的概要以及ginEntryInsert函数的主要步骤。同时,文章还阐述了GIN索引的查询机制,强调了其位图查询和结果集控制特性,特别是gin_fuzzy_search_limit参数的作用。
摘要由CSDN通过智能技术生成

2021SC@SDUSC
本篇博客继续讲解GIN索引创建和插入相关的函数,并讲解GIN索引的查询过程

GIN索引的创建

ginbuild

由于该函数调用了其他的大量函数,在这里不一一分析,我将GIN索引的创建过程概括如下
1)调用initGinState初始化创建状态变量buildstate ( GinBuildState类型)的ginstate字段,初始化GIN索引的元页,并初始化buildstate的其他字段,包括置indtuples为0、创建临时内存上下文和函数调用内存上下文。

2)初始化“ 蓄积池”。
3)对基表扫描,并将ginBuildCallback函数的指针传递给IndexBuild- HeapScan。每扫描到一个基 表元组,IndexBuildHeapScan 都将其被索引属性的值解析出来然后传递给ginBuildallback处理,在ginBuildCallback中将进行以下处理:

①对于每一个被索引属性的值,调用ginHeapTupleBulkInsert 对其进行处理,该函数会调用GIN 索引的extractValue方法将被索引|属性的值解析成若千个Entry (一个属性值中可能包含多个关键 词),并将这些获得的Entry 插人到“蓄积池”中( ginInsertRecordBA兩数),该函数值将返回获得 的Entry 的个数,这个数量将被累加到buildstate 的indtuples 字段中。

②对“蓄积池”的填充情况进行检查,如果allocatedMemory或maxdepth字段的值超过阙值则循环调用ginGetEntry从“蓄积池”中取出一个Entry,并将其用ginEntryInsert插人到GIN索引中。

③当“蓄积池”中的Entry都已经被插入到GIN索引中后,通过重置buildstate中的临时内存上 下文来清空“蓄积池”,然后调用ginInitBA重新初始化“ 蓄积池”。

5)当IndexBuildHeapScan扫描完成后,“ 蓄积池”中有可能还有一部分Entry 没有被插人到 GIN索引中,同样循环调用ginGetEntry获取Entry再通过ginEntryInsert插入CIN索引中。

6)返回统计信息

IndexBuildResult *
ginbuild(Relation heap, Relation index, IndexInfo *indexInfo)
{
   
	IndexBuildResult *result;
	double		reltuples;
	GinBuildState buildstate;
	Buffer		RootBuffer,
				MetaBuffer;
	ItemPointerData *list;
	Datum		key;
	GinNullCategory category;
	uint32		nlist;
	MemoryContext oldCtx;
	OffsetNumber attnum;

	if (RelationGetNumberOfBlocks(index) != 0)
		elog(ERROR, "index \"%s\" already contains data",
			 RelationGetRelationName(index));

	initGinState(&buildstate.ginstate, index);
	buildstate.indtuples = 0;
	memset(&buildstate.buildStats, 0, sizeof(GinStatsData));

	/* 初始化元页 */
	MetaBuffer = GinNewBuffer(index);

	/* 初始化根节点 */
	RootBuffer = GinNewBuffer(index);

	START_CRIT_SECTION();
	GinInitMetabuffer(MetaBuffer);
	MarkBufferDirty
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值