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.mzph.cn/news/589582.shtml

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

相关文章

DSL查询语法和RestClient查询文档

目录 DSL查询语法 DLS Query的分类 DSL Query基本语法 全文检索查询 精准查询 地理查询 复合查询 Function Score Query 复合查询 Boolean Query 搜索结果处理 排序 分页 分页 深度分页问题 深度分也解决方案 高亮 RestClient查询文档 快速入门 全文检索查…

MK米客方德品牌 SD NAND在对讲机领域的引领作用

SD NAND在对讲机上的应用 SD NAND在对讲机上广泛应用,为其提供了高效可靠的存储解决方案。 这种存储技术不仅能容纳大量语音和数据文件,而且具有高速读取的特点,保障了实时通信的质量。SD NAND还注重安全性,通过数据加密和访问控…

解锁React魔法门:高效项目开发工作流揭秘

你好,我是坚持分享干货的 EarlGrey,翻译出版过《Python编程无师自通》、《Python并行计算手册》等技术书籍。 如果我的分享对你有帮助,请关注我,一起向上进击。 创作不易,希望大家给一点鼓励,把公众号设置为…

OSCHINA Gitee 联合呈现,《2023 中国开源开发者报告》正式发布,总结分非常帮,可以免费看的报告!

《2023 中国开源开发者报告》 详细地址: https://talk.gitee.com/report/china-open-source-2023-annual-report.pdf 不需要收费下载!! 其中大模型的部分总结的非常棒 gietee 也支持 AI 模型托管了 如何在 Gitee 上托管 AI 模型 https://…

【java爬虫】使用element-plus进行个股详细数据分页展示

前言 前面的文章我们讲述了获取详细个股数据的方法,并且使用echarts对个股的价格走势图进行了展示,本文将编写一个页面,对个股详细数据进行展示。别问涉及到了element-plus中分页的写法,对于这部分知识将会做重点讲解。 首先看一…

Autosar MCAL-RH850P1HC Dio配置

文章目录 DioDioGeneralDioCriticalSectionProtectionDioDevErrorDetectDioDeviceNameDioFlipChannelApiDioMaskedWritePortApiDioUseWriteVerifyErrorInterfaceDioVersionCheckExternalModulesDioVersionInfoApiDioWriteVerifyDioWriteVerifyErrorInterface DioPortP0-P9DioPo…

管道进行进程间通信(上)

管道进行进程间通信 在posix和system V标准还没有出现的时候,进程间是如何进行通信的呢?这就要借助于我们今天学习的这个东西了。在进程间通信的标准没有出现之前,在os中就已经存在了文件了。而管道就是基于文件的一种进行进程间通信的方式。…

WorkPlus为企业打造私有化部署IM解决方案

在移动数字化时代,企业面临着如何全面掌控业务和生态的挑战。企业微信、钉钉、飞书、Teams等应用虽然提供了部分解决方案,但无法满足企业的私有化部署需求。此时,WorkPlus作为安全专属的移动数字化平台,被誉为移动应用的“航空母舰…

独热编码的两种实现形式

独热编码的两种实现形式: ​ OneHotEncoder和DictVectorizer是两种常用的特征向量化方法,用于将分类特征转换为数值特征。但还是有一定的区别不管是再输入格式还是在输出类型上都有一些不同。 区别: 输入格式要求: OneHotEncod…

小梅哥Xilinx FPGA学习笔记18——专用时钟电路 PLL与时钟向导 IP

目录 一:IP核简介(具体可参考野火FPGA文档) 二: 章节导读 三:PLL电路原理 3.1 PLL基本实现框图 3.2 PLL倍频实现 3.3 PLL分频实现 四: 基于 PLL 的多时钟 LED 驱动设计 4.1 配置 Clocking Wizard 核 4.2 led …

NXP实战笔记(二):S32K3xx基于RTD-SDK在S32DS上配置PIT与STM中断并反转IO

目录 1、PIT 1.1、PIT概述 1.2、PIT的配置 1.3、Dio配置 1.4、中断配置 1.5、测试代码 1.6、测试结果 2、STM 2.1、STM概述 2.2、STM的配置 2.3、测试代码 2.4、测试结果 1、PIT 1.1、PIT概述 PIT是一组定时器,可用于引发中断和触发器,包括一…

PyQt5-控件之QDialog(UI-业务分离搭建自定义xDialog)

1.继承QtWidgets.QWidget自定义对话框 继承于QtWidgets.QWidget自定义一个对话框类:SelectingDlg class SelectingDlg(QtWidgets.QWidget): def __init__(self): super(SelectingDlg, self).__init__() self.initUI() def initUI(self):s…

数据结构和算法-B+树(性质 查找)

文章目录 B树叶子节点B树的查找第一种查找方式第二种查找方式 小结 B树 B树节点的关键个数1B树该节点的子树个数 B树节点的关键字个数和节点的子树个数一样 叶子节点包含全部关键字,并且都相互链接了 叶子节点 根节点也能是叶子节点 B树的查找 第一种查找方式…

HTTP分数排行榜

HTTP分数排行榜 介绍一、创建数据库二、创建PHP脚本三、上传下载分数四、测试 介绍 Unity中向服务器发送用户名和得分,并存入数据库,再讲数据库中的得分按照降序的方式下载到Unity中。 一、创建数据库 首先,我们要在MySQL数据库中建立一个…

Adobe ColdFusion 文件读取漏洞(CVE-2010-2861)

漏洞原理 Adobe ColdFusion是美国Adobe公司的一款动态Web服务器产品,其运行的CFML(ColdFusion Markup Language)是针对Web应用的一种程序设计语言。由于AJP协议设计存在缺陷导致内部相关的属性可控,攻击者可以构造属性值&#xff…

.NET Core中灵活使用反射

前言 前段时间有朋友问道一个这样的问题,.NET Core中如何通过Attribute的元数据信息来调用标记的对应方法。我第一时间想到的就是通过C#反射获取带有Custom Attribute标记的类,然后通过依赖注入(DI)的方式获取对应服务的方法并通…

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

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

王道考研计算机组成原理——存储系统

存储系统的基础知识 微信打开的时候会有一个人站在地球上,这个过程就是把程序从辅存转移到主存,数据只有调入主存当中才可以被CPU访问 cache:主存速度还是慢,为了进一步缓解CPU和主存之间的速度矛盾 在微信打视频聊天的时候&am…

Git 常用命令(从远程gitee/GitCode/GitHub下载项目到本地仓库)

​分布式项目控制管理gitGit 分布式版本控制系统(序章1)windows和linux操作Git(序章2) git在windows和ubuntu操作命令无异。本次举例平台:ubuntu18.04 查看是否安装和查看版本号 git --version # 仓库 # 在当前目录新建一个Git代码库$ git init​# 新建一个目录…

约翰瑟尔的故事

约翰瑟尔的故事 你即将看到的是“瑟尔效能机”创始者,约翰瑟尔的故事 据瑟尔原话,该装置会是通向自由能源的关键 “他”拥有“会飞”等不可思议的特性相关说法还有待证实,此记录篇仅为告知观者 制片方对瑟尔技术持中立态度 以下是我们所搜集…