opeGauss 之BitmapOr算子代码走读

news2024/9/20 13:19:05
一. 前言

        在openGauss中,BitmapOr算子扫描是指谓词条件是索引列的or条件时,将多个or条件的索引谓词先组成一个需要扫描元组的BitmapOr扫描算子,然后再通过BitmapOr算子的tid信息去扫描元组,从而减少or条件带来的随机扫描过多的问题,如下所示:

      本文主要通过走读代码了解openGauss是怎么实现BitmapOr算子的功能的。

二. 执行计划生成

       执行计划生成主要是如何在堆扫描下生成一个BitmapOr算子,BitmapOr算子包含所要扫描的元组信息。执行计划生成的入口在create_index_paths函数中,主要的代码流程如下所示:

create_index_paths
    indexpaths = generate_bitmap_or_paths(root, rel, rel->baserestrictinfo, NIL, false);
        foreach (lc, clauses) {
            if (!restriction_is_or_clause(rinfo))     // 只支持or语句
                continue;
                
            foreach (j, ((BoolExpr*)rinfo->orclause)->args) {  // 遍历各个or条件
                build_paths_for_OR
                    match_clauses_to_index(index, clauses, &clauseset);   // 检查索引和谓词的匹配情况
                    indexpaths = build_index_paths   // 每个or条件只是建立一个普通索引
                    result = list_concat(result, indexpaths);  // 把当前的索引建出来的路径保存到结果中
                bitmapqual = choose_bitmap_and(root, rel, indlist, globalIndexList); // 合并多索引情况下的bitmap和挑选代价最小的索引
                    for (i = 0; i < npaths; i++) {
                            if (i == 0 || chooseInfo.costsofar < bestcost) {
                                bestpaths = chooseInfo.paths;
                                bestcost = chooseInfo.costsofar;
                             }
                    }
                pathlist = lappend(pathlist, bitmapqual);
            }
            
            bitmapqual = (Path*)create_bitmap_or_path(root, rel, pathlist);  // 所有约束参数的索引连起来形成bitmap索引
                cost_bitmap_or_node(pathnode, root);
                    foreach (l, path->bitmapquals) {
                        cost_bitmap_tree_node(subpath, &subCost, &subselec);
                        selec += subselec;   // bitmap or的代价为各个or索引的代价之和
                    }   
        }
    indexpaths = generate_bitmap_or_paths(root, rel, joinorclauses, rel->baserestrictinfo, false); // 如果有or条件的话,也利用or条件作为约束生成一个新的bitmap path
    
    bitmapqual = choose_bitmap_and(root, rel, bitindexpaths); // 如果有多个bitmap索引路径生成,挑选出代价最小的
    bpath = create_bitmap_heap_path(bitmapqual);  //生成最后的堆扫描路径,bitmapqual条件为上述生成的bitmapor路径
    add_path(root, rel, (Path*)bpath);   // 保存路径

三. 算子层的实现

     算子层的实现入口在BitmapHeapTblNext函数中,代码流程如下所示:

BitmapHeapTblNext
    if (tbm == NULL) {    初始化需要扫描元组tid的bitmap
        MultiExecProcNode(outerPlanState(node));  // 获取需要访问的元组的tid,并且生成bitmap
            MultiExecBitmapIndexScan  
                scan_handler_idx_getbitmap(scandesc, tbm)
                    index_getbitmap(scan, bitmap)
                        btgetbitmap_internal(IndexScanDesc scan, TIDBitmap *tbm)
                            for (;;) {    // 根据谓词条件确认访问元组的上下界,并且将对应的位置加入到bitmap中
                                tbm_handler._add_tuples(tbm, heapTid, 1, false, currPartOid, bucketid); // 把索引的元组位置转成bitmap
                            }
        TableScanBitmapNextBlock(scan, tbmres, &node->ss.ps.state->have_current_xact_date)
            heapam_scan_bitmap_next_block
                hscan->rs_base.rs_cbuf = ReleaseAndReadBuffer();   // 拿到buff
                for (curslot = 0; curslot < tbmres->ntuples; curslot++) {
                    OffsetNumber offnum = tbmres->offsets[curslot];
                    hscan->rs_base.rs_vistuples[ntup++] = ItemPointerGetOffsetNumber  // 获取位置信息
                }
    }
    TableScanBitmapNextTuple
        HeapamScanBitmapNextTuple
            targoffset = hscan->rs_base.rs_vistuples[hscan->rs_base.rs_cindex];
            lp = PageGetItemId(dp, targoffset);   // 获取到元组所在的位置
            hscan->rs_ctup.t_data = (HeapTupleHeader)PageGetItem((Page)dp, lp);  // 拿到数据
            hscan->rs_base.rs_cindex++;   // ++ 指向下一次读取的位置

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

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

相关文章

《企业实战分享 · SonarQube10.x 详细教程》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

线下活动|落地武汉、长沙高校,10场AI沙龙火爆来袭

人工智能作为引领时代发展的重要力量&#xff0c;正以前所未有的速度改变着我们的世界&#xff0c;而智能体因其开发门槛低、应用场景广泛等优势成为最热门的AI应用方向之一&#xff0c;未来将拥有庞大生态。为此&#xff0c;百度百科校园在开学季的9月联合文心智能体平台在武汉…

清理C盘缓存的垃圾,专业清理C盘缓存垃圾的步骤与策略

在维护计算机系统的过程中&#xff0c;定期清理C盘&#xff08;通常是系统盘&#xff09;中的缓存和垃圾文件是一项至关重要的任务。这不仅能有效释放磁盘空间&#xff0c;提升系统性能&#xff0c;还能减少因磁盘空间不足导致的程序运行缓慢或错误。以下是一系列专业且安全的步…

品胜电子携手成都蓉城,共谋“商业+体育”合作新篇章

9月14日,广东品胜电子股份有限公司(以下简称品胜电子)与成都蓉城足球俱乐部(以下简称成都蓉城)正式签约,成为其官方合作伙伴。全国数码3C行业领军企业与中超强队的携手合作,标志着双方将在“商业体育”融合的模式下资源共享相互赋能,提升其品牌影响力。 蓉城足球俱乐部相关人士…

HTB-Included(本地文件包含、TFTP文件上传、LXD容器挂载目录)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解Included靶机 渗透过程 信息搜集 rustscan工具 通常只扫描TCP端口&#xff0c;所以我们要配合nmap进行-sU 执行udp端口扫描 可以观察到 服务器开放了TFTP UDP端口&#xff0c;用来进行文件传输协议…

2024年度10款视频剪辑软件分享

在视频创作日益盛行的今天&#xff0c;一款强大而易于上手的视频剪辑软件成为了每位创作者不可或缺的工具。无论是专业电影制作人、Vlog博主&#xff0c;还是视频编辑爱好者&#xff0c;都能在市场上找到适合自己的那一款。以下是2024年度推荐的10款视频剪辑软件&#xff0c;涵…

推荐一款免费的图片压缩软件,自媒体运营者、摄影爱好者的必备工具

随着社会的发展&#xff0c;咱们生活里的各种新鲜玩意儿越来越多&#xff0c;互联网就像是一个超级大的市场&#xff0c;啥都能干。比如说&#xff0c;咱们现在拍照、看视频、刷朋友圈、逛网店&#xff0c;这些都离不开图片。但是呢&#xff0c;图片这玩意儿&#xff0c;它占地…

self-play RL学习笔记

让AI用随机的路径尝试新的任务&#xff0c;如果效果超预期&#xff0c;那就更新神经网络的权重&#xff0c;使得AI记住多使用这个成功的事件&#xff0c;再开始下一次的尝试。——llya Sutskever 这两天炸裂朋友圈的OpenAI草莓大模型o1和此前代码能力大幅升级的Claude 3.5&…

跨平台Markdown写作软件:小书匠

本文软件由好友 Eduna 推荐&#xff1b; 什么是小书匠 &#xff1f; 小书匠是一款本地优先&#xff0c;去中心化&#xff0c;分布式&#xff0c;支持选择性同步的全平台覆盖笔记软件&#xff0c;是专注于 markdown 写作的客户端编辑器。它支持多种平台&#xff0c;包括 Windows…

Qt Model/View之代理

概念 与模型-视图-控制器模式不同&#xff0c;模型/视图设计没有包含一个完全独立的组件来管理与用户的交互。通常&#xff0c;视图负责向用户展示模型数据&#xff0c;并负责处理用户输入。为了在获取输入的方式上具有一定的灵活性&#xff0c;交互由委托执行。这些组件提供输…

5 个最佳开源无代码项目管理工具

想象一下&#xff0c;你是一名项目经理&#xff0c;每天早上刚坐到办公桌前&#xff0c;咖啡还在手里&#xff0c;你的手机和电脑屏幕上已经被各种未完成的任务、项目更新和团队消息填满。 你快速浏览着的电子邮件&#xff0c;分配任务的通知不断弹出&#xff0c;而每一个通知…

Shopee虾皮:广告类型选择与效果优化要点

Shopee虾皮作为东南亚增势迅猛的电商平台&#xff0c;是很多跨境卖家出海东南亚的首要选择。这势必带来强烈的竞争&#xff0c;因此&#xff0c;如果卖家想要突出重围&#xff0c;广告投放和优化则格外重要。 一、虾皮的广告类型 1.关键词广告 当买家搜索的关键字与卖家投放的…

进程优先级和环境变量

1.优先级 1.优先级的概念 cpu资源分配的先后顺序&#xff0c;就是指进程的优先级&#xff0c;linux中进程的优先级数字越小&#xff0c;优先级越高&#xff1b; 2.为什么要有优先级 进程访问的资源(cpu)始终是有限的&#xff0c;而系统中进程又是比较多的&#xff0c;所以进…

【Jetson】Jetson Orin NX刷机教程

Jetson Orin NX刷机教程 一、硬件准备二、安装SDK Manager三、在线或离线刷机 一、硬件准备 需要将Jetson Orin NX的GND和FC_REC引脚短接&#xff0c;设备进入刷机模式。然后用Type-C线将其余主机连接&#xff0c;主机的选择可以为ubuntu虚拟机或者ubuntu系统。注意如果选择虚…

Mybatis接受查询结果的情况

Mybatis接受查询结果的情况 1.查询结果为单条数据时 1&#xff09;通过实体类对象接受 这种方式最直观&#xff0c;当查询结果只有一条记录时使用。在 mapper 接口中定义一个方法&#xff0c;并指定返回类型为对应的实体类类型。mapper.xml 文件中的 <select> 标签使用…

vue3项目打包后多级嵌套路由子路由刷新后空白问题

问题描述 Vue3项目打包发布后&#xff0c;进入个人中心界面,刷新后页面出现空白。前提是已经配置了重定向到index.html。在访问/personal/profile这种路由的时候刷新后页面会出现空白。在App.vue中有一个routerview ,personal界面中有一个routerview .界面如图所示 router.js…

【Python基础】Python错误和异常处理(详细实例)

本文收录于 《Python编程入门》专栏&#xff0c;从零基础开始&#xff0c;分享一些Python编程基础知识&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、Python中的错误类型三、Python异常处理机制3.1 try-except语句3.2 try-except-else语句3.3 try-fi…

GD - GD32350R_EVAL - PWM实验和验证2 - EmbeddedBuilder - 无源蜂鸣器

文章目录 GD - GD32350R_EVAL - PWM实验和验证2 - EmbeddedBuilder - 无源蜂鸣器概述笔记先前失败的实验电路图本次成功的图 - 无源蜂鸣器电路模块接入实验模块实验软件工程主循环实现PWM频率改变蜂鸣器声音大小实验结果和官方给的蜂鸣器频率响应曲线基本一样看看实际波形END G…

智慧交通基于yolov8的行人车辆检测计数系统python源码+onnx模型+精美GUI界面

【算法介绍】 智慧交通中&#xff0c;基于YOLOv8的行人车辆检测计数系统是一项高效、准确的技术解决方案。该系统利用YOLOv8这一先进的目标检测算法&#xff0c;结合深度学习技术&#xff0c;能够实时检测并准确计数道路上的行人和车辆。YOLOv8在保证检测速度的同时&#xff0…

视图(mysql)

一、什么是视图 视图是⼀个虚拟的表&#xff0c;它是基于⼀个或多个基本表或其他视图的查询结果集。视图本⾝不存储数 据&#xff0c;⽽是通过执⾏查询来动态⽣成数据。⽤⼾可以像操作普通表⼀样使⽤视图进⾏查询、更新和管 理。视图本⾝并不占⽤物理存储空间&#xff0c;它仅…