2021SC@SDUSC
本篇博客主要讲解Gin索引创建和插入的过程和相关的数据结构,由于过程较为复杂,会在下一篇博客会具体分析相关函数。

目录

  • GIN创建
    • 创建过程
    • 主要数据结构
      • GinBuildState
      • BuildAccumulator
      • GinEntryAccumulator
  • GIN插入
    • 插入过程
    • 相关数据结构
      • GinBtreeData
      • GinBtreeStack

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

 typedef struct GinEntryAccumulator
{RBTNode        rbtnode;//RTtree树结构Datum        key;GinNullCategory category;OffsetNumber attnum;//记录该属性是被索引属性的第几个bool      shouldSort;//来确定entry的Posting list是否需要排序ItemPointerData *list;//entry所有出现的值uint32       maxcount;       /* list所允许的最大数量 */uint32        count;          /* 当前list的数量 */
} GinEntryAccumulator;

GIN插入

插入过程

在GIN索引创建中避免不了使用GIN索引的相关插入函数,大体过程是在蓄积池的指标超过阈值时,我们需要将Entry从中拿出插入到GIN索引中,将Entry封装成一个数据结构GinBtreeData,使用其中的相关函数查找Entry以及构建Posting Tree等操作,而关于插入最主要的函数gininsertEntry函数,下一篇博客我们会具体讲解,我们本篇讲解与插入相关的函数的数据结构

相关数据结构

GinBtreeData

typedef struct GinBtreeData
{/*查找模式使用的函数指针 */BlockNumber (*findChildPage) (GinBtree, GinBtreeStack *);BlockNumber (*getLeftMostChild) (GinBtree, Page);bool     (*isMoveRight) (GinBtree, Page);bool        (*findItem) (GinBtree, GinBtreeStack *);/* 插入模式使用的函数指针*/OffsetNumber (*findChildPtr) (GinBtree, Page, BlockNumber, OffsetNumber);GinPlaceToPageRC (*beginPlaceToPage) (GinBtree, Buffer, GinBtreeStack *, void *, BlockNumber, void **, Page *, Page *);void        (*execPlaceToPage) (GinBtree, Buffer, GinBtreeStack *, void *, BlockNumber, void *);void       *(*prepareDownlink) (GinBtree, Buffer);void      (*fillRoot) (GinBtree, Page, BlockNumber, Page, BlockNumber, Page);bool     isData;     Relation    index;//索引表BlockNumber rootBlkno;   //该Entry所在页面的根页面GinState   *ginstate;       /* 记录五中扩展方法 */bool      fullScan;//是否完全扫描bool       isBuild;//该Entry对应的位置信息上是否已经构建了B-TreeOffsetNumber entryAttnum;//Entry在索引元组中对应的属性编号Datum     entryKey;//Entry的键值GinNullCategory entryCategory;ItemPointerData itemptr;//Entry位置数组
} GinBtreeData;

该数据结构定义了9个函数函数指针,实现了对于GIN索引结构的查找,插入,分裂等操作,对于每一个函数指针,既可以定义对于Entry节点操作的函数,也可以指向对位置信息进行操作的函数。每个函数的大体功能如下:

  1. findChildPage: 在GinBtreeStack类型参数的buffer 字段对应的非叶子层页面中找到Entry (由GinBtreeData 类型参数表示)对应的索引元组( 由于是非叶子层页面,索引元组中的指针指向下一层的孩子页面),并返回索引元组指向的孩子页面的块号。

  2. isMoveRight: 比较Page 类型参数对应的页面中最后一个索引元组与GinBtree对应的Entry的值大小,如果小于则返回真(表示该页面应该右移),否则返回假。

  3. findItem: 在GinBtreeStack类型参数的buffer 字段对应的叶子层页面中查找Entry (由GinB-treeData类型参数表示)对应的索引元组,若存在,将索引元组在页面中的偏移量赋给GinBtreeS-tack类型参数的off字段并返回真,否则返回假。

4)findChildPtr:在Page类型参数对应的页面中查找孩子页面号为BlockNumber的索引元组的页面内偏移量并返回。

  1. getLeftMostPage: 返回非叶子层页面中第-一个索引元组指向的页面号。

6)isEnoughSpace:判断Buffer类型参数指向的缓冲区中是否有足够空间存储GinBtree对应的索引元组,如果有足够空间则返回真,否则返回假。

  1. placeToPage: 将GinBtree中的索引元组写到缓冲区中,OffsetNumber 类型参数为写人缓冲区的起始偏移量,并写日志。

  2. splitPage: 将GinBtree中的索引元组插人到第-一个参数指定的缓冲区中,并将该缓冲区分裂成两个大小几乎相当的缓冲区,分裂产生的新缓冲区放在第二个参数中,返回第-一个缓冲区的页面号,最后写日志。

9)flRoot:将第三、四个参数指定的两个缓冲区最右端的索引元组填充到第二个参数指定的缓冲区中,并将被填充索引元组的指针分别指向第三、四个参数对应的页面号。

GinBtreeStack

该结构用于记录索引结构在每次查找过程中从根节点到叶子节点的路径,当插人一个Entry引起节点分裂后,需要使用该结构向上 回溯调整。其数据结构如下

typedef struct GinBtreeStack
{BlockNumber blkno;//磁盘号Buffer      buffer;//对应的缓冲区号OffsetNumber off;//查找到的索引元组在页面中的偏移量ItemPointerData iptr;/* predictNumber contains predicted number of pages on current level */uint32       predictNumber;//当前层级上预测的页数struct GinBtreeStack *parent;//指向父节点的指针
} GinBtreeStack;

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

  1. PostgreSQL源码分析

    PostgreSQL源码结构 PostgreSQL的使用形态 PostgreSQL采用C/S(客户机/服务器)模式结构.应用层通过INET或者Unix Socket利用既定的协议与数据库服务器进行通信 ...

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

    2021SC@SDUSC 本篇博客主要讲解GiST索引创建以及删除的相关函数 这里写目录标题 GIST创建 相关数据结构 GISTBuildState GISTInsertStack gistbuil ...

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

    2021SC@SDUSC 上一篇博客讲了关于Hash索引创建与插入的相关函数,这一篇博客讲述关于溢出页的操作函数以及Hash表的扩展相关的函数. 目录 溢出页的分配和回收 _hash_addovflp ...

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

    2021SC@SDUSC 目录 Hash索引创建 hashbuild函数 _hash_init函数 Hash索引的插入 hashinsert函数 _hash_doinsert函数 总结 Hash索引创 ...

  5. postgreSQL源码分析——索引的建立与使用——各种索引类型的管理和操作(2)

    2021SC@SDUSC 目录 上层操作函数 index_open index_beginscan() index_create() indexcmd.c 下层接口函数 IndexScanDescDa ...

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

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

  7. postgreSQL源码分析——索引的建立与使用——Hash索引(1)

    2021SC@SDUSC 目录 Hash索引 Hash索引原理 Hash表 Hash索引结构 Hash的页面结构 元页 桶页,溢出页,位图页 和B-Tree相比的优缺点 优点 缺点 总结 Hash索引 ...

  8. postgreSQL源码分析——索引的建立与使用——各种索引类型的管理和操作(1)

    2021SC@SDUSC 目录 概述 管理索引的系统表 记录索引相关的系统表 与索引系统表相关的后端源码 索引的操作函数 上层操作函数 下层接口函数 概述 索引是指按表中某些关键属性或表达式建立元组的 ...

  9. postgreSQL源码分析——索引的建立与使用——总结篇

    2021SC@SDUSC 在小组中我负责索引的建立与使用的相关部分,在此一共写了16篇相关的分析报告,着重分析各种索引的操作和管理方法,以及分析了PG中四种最重要的索引B-Tree索引,Hash索引, ...

  10. postgreSQL源码分析——索引的建立与使用——B-Tree索引(3)

    2021SC@SDUSC 目录 B-Tree的插入 bt_insert _bt_doinsert BTInsertStateData _bt_search函数 _bt_moveright函数 B-Tr ...

最新文章

  1. 关于Element学习笔记
  2. 查看Linux上程序或进程用到的库
  3. 项目学习类容,日期处理,SQL语句查询,hashtable的运用,R语言包的环境配置
  4. android listview仿iphone特效
  5. win11如何加快搜索速度 Windows11更改文件索引加快搜索速度的设置方法
  6. 酷派无线升级服务器设置在哪里,酷派手机CDA自助升级线刷工具安装教程
  7. 巨头争云存储祭免费旗 或重演视频业消耗战
  8. 测试用例设计方法_正交实验法(游戏向)
  9. js中的entries方法的使用
  10. 网络游戏开发成本,运营成本,收入
  11. Excel、Word、PPT显示VB运行时错误53的解决办法
  12. gmap mysql cachet_MySQL中binlog cache使用流程解惑
  13. ARP和RARP协议工作原理
  14. 前端实现搜索关键字高亮功能:
  15. 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群
  16. day04 【Map】
  17. 关于KB2464588的一些问题
  18. css 图片切换模版
  19. rootfs编译步骤2解析
  20. learnLinux

热门文章

  1. Linux Intel网卡IGB驱动修改mac地址
  2. 【kafka】kerberos认证下 kafka 报错Bootstrap broker host:ip (id: -1 rack: null) disconnected
  3. 【Flink】Flink 1.13 Flink SQL 新特性 性能优化 时区 时间 纠正
  4. 【Elasticsearch】2021 年的顶级 ETL 工具......以及对 ETL 说“不”的理由
  5. 【ElasticSearch】Es 源码之 MetadataUpgrader 源码解读
  6. 【ES】CURL 操作 ES命令集合
  7. Doker : Docker 容器与宿主机共享文件
  8. 50-20-200-配置-checkpoint配置
  9. Drools 7.11 :入门程序
  10. Spark的event事件监听器LiveListenerBus和特质SparkListenerBus以及特质ListenerBus