OpenGauss 之索引查找和匹配

一. 前言

       本文主要通过走读OpenGuass的代码,来了解查询的时候OpenGuass是如何查找表的索引信息以及根据谓词条件过滤掉无用的索引信息的。

二. 索引路径匹配流程

     1.  首先OpenGuass在build_simple_rel的时候,首先将一个表以及与他相关的索引都加到rel->indexlist中,后续再筛选。主要代码如下所示:

build_simple_rel
​   switch (rte->rtekind) {
​       case RTE_RELATION:
​           get_relation_info
​               List* indexoidlist = RelationGetIndexList(relation)   // 到pg_index系统表中查找与relation相关的索引
​                    while (HeapTupleIsValid(htup = systable_getnext(indscan))) {
​                        result = insert_ordered_oid(result, index->indexrelid)   // result保存着索引的oid
​                    }
​              indexinfos = lcons(info, indexinfos)  // 无条件保留与一个表有关的所有索引
​              rel->indexlist = indexinfos}

        2. 再在create_index_paths中,根据列的过滤条件对用不上的索引进行剔除,主要代码如下:

create_index_paths
​    foreach (lc, rel->indexlist) {
​        match_restriction_clauses_to_index(&rclauseset);// 如果此索引跟谓词条件无关,则剔除此索引
​        bitindexpaths = list_concat(bitindexpaths, indexpaths);
​        add_path(root, rel, (Path*)bpath);   // 为索引建立起路径,建立的索引路径也会和其他路径进行代价对比取舍
​    }

         3. 保留下来的索引将计算代码,和顺序扫描等其他路径进行代码比较,再决定是否使用。

三. BitmapOrPath

      当查询条件带有or条件的时候,OpenGuass会生成一个BitmapOrPath将各个索引及其过滤条件连接起来,如对于select * from t1 where id = 1 or id = 2语句,会通过BitmapOr将多个条件应用到索引再通过BitmapOrPath连接起来,如下所示:

     

    其实现过程主要如下所示:

generate_bitmap_or_paths
​    foreach (j, ((BoolExpr*)rinfo->orclause)->args) {      // 逐个遍历or的所有条件
​        orargs = list_make1(orarg);
​        indlist = build_paths_for_OR
​            indexpaths = build_index_paths    // 用or其中一个条件构建一个index path
​        pathlist = lappend(pathlist, bitmapqual)  // 将当前or的其中一个条件保存到pathlist中
​    }
​    bitmapqual = create_bitmap_or_path(pathlist)    // 将pathlist组装成BitmapOrPath路径

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/313229.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

书摘:C 嵌入式系统设计模式 05

本书的原著为:《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》,讲解的是嵌入式系统设计模式,是一本不可多得的好书。 本系列描述我对书中内容的理解。 书中大量使用了 UML 表示法&#xff0…

FTP简介及搭建计算机端口的介绍

目录 一. FTP的简介 二. FTP的主要作用 三. 搭建FTP服务器 3.1 开启防火墙 3.2 创建组 3.3 创建用户 3.4 用户绑定组 3.5 安装FTP服务器 3.6 配置FTP服务器 3.7 配置FTP文件夹的权限 3.8 连接测试 3.8.1 服务器本机测试 3.8.2 外部服务器测试 3.8.3 借助工具MobalXterm 四…

7.12全排列②(LC47-M)

算法: 这道题目和46.全排列 (opens new window)的区别在与给定一个可包含重复数字的序列,要返回所有不重复的全排列。 所以就是多了个去重操作。 还是一样的套路: 先排序: Arrays.sort(nums); 再去重: // used[…

RainBond 构建组件 rbd-chaos 故障解决 【真实案例】

文章目录 背景分析官方排查说明尝试进一步分析解决参考背景 在 RainBond 中把所有组件都部署了至少 2 个实例后,开始出现构建/滚动更新直接报错,且没有日志(查看日志按钮点击后,里面啥也没有)。 然后再平台管理主界面,可以看到提示 rbd-chaos 组件故障: 分析 官方排…

中小微医院机构云服务(云HIS)平台源码

云HIS(Cloud-Based Healthcare Information System)重新定义了HIS,目标是为中小型医疗卫生机构提供优质经济的医疗卫生信息化产品及服务;是以健康档案为主线、以电子病历为核心、以云计算技术为基础的医疗卫生系统。云HIS作为基于…

【已解决】若依系统前端打包后,部署在nginx上,点击菜单错误:@/views/system/role/index

​ 上面错误,是因为/views/system/role/index动态路由按需加载时候,错误导致。 解决办法: 如果您的前端项目访问时候,需要带有项目名称的话,参考凯哥上一篇文章:【已解决】若依前后端分离版本&#xff0…

Django 学习教程- Hello world入门案例

系列 Django学习教程-介绍与安装 欢迎来到第Djagno学习教程第二章Hello World 入门案例。 在本教程中,我将引导您完成django的Hello World入门案例。 让我们开始吧! 版本 Django 5.0Python 3.10 创建项目 安装 Django 之后,您现在应该…

C++数据结构-栈

目录 栈顺序栈链栈 栈 栈是允许在表的一端进行插入和删除的线性表。表中允许插入删除的一端是栈顶,栈顶的当前位置是动态变化的;不允许插入和删除的一端是栈底,栈底的位置是不变的。当表中没有元素时称为空栈,插入数据的运算称为…

【STM32F103】SysTick系统定时器延时函数

SysTick SysTick是Cortex-M3内核中的一个外设,内嵌在NVIC中,叫系统定时器。 当处理器在调试期间被喊停时,SysTick也将暂停运作。 一共有四个寄存器,不过我们通常用前三个,不需要校准。下图出自《STM32F10xxx Cortex…

35--JDK新特性

1、新语法结构 新的语法结构,为我们勾勒出了 Java 语法进化的一个趋势,将开发者从复杂、繁琐的低层次抽象中逐渐解放出来,以更高层次、更优雅的抽象,既降低代码量,又避免意外编程错误的出现,进而提高代码质…

Linux软件包管理器——yum命令

如何使用yum 一、快速认识yum(简单介绍)二、快速使用yum2.1 rzsz2.2 linux命令行小游戏和彩蛋 三、yum的整个生态问题 一、快速认识yum(简单介绍) Linux中我们也要进行工具/指令/程序,安装,检查卸载等,需要yum的软件 安装软件的方式&#xf…

<Icon-ResizER>support

If you get any questions in using app, email me caohechunhotmail.com.