openGauss 之min/max 优化代码走读

一. 前言

       在openGuass中,如果对索引列执行max/min操作,openGauss会优化成只读取索引的最前/后的一行数据,避免了对整表数据进行读取和聚合操作,如下所示:

二. min/max优化代码走读

      1. 首先需要将min/max 算子转成成执行计划中降序/升序的keypath,代码流程如下所示:

preprocess_minmax_aggregatesfind_minmax_aggs_walker // 从pg_aggregate中查出max/min对应的aggsortop,max对应的是>, min对应的是<get_equality_op_for_ordering_op //根据aggsortop到pg_amop表中查找对应的op信息,如amopstrategy等,对应是查询中是需要顺序扫描还是逆序扫描build_minmax_pathsortcl->eqop = eqop;sortcl->sortop = sortopparse->sortClause = st_make1(sortcl);  // 已经将max/min聚合操作映射成排序操作,max对应的是逆序,min对应着是顺序parse->limitCount = makeConst(1)  // 其实已经将执行计划中的max替换成了order by desc limit 1,min被替换成了 order by asc limit 1query_plannerconstruct_pathkeysconstruct_pathkeysmake_pathkeys_for_sortclausesmake_pathkey_from_sortop  // 根据第一步拿到的aggsortop生成pathkeymake_pathkey_from_sortinfostrategy = reverse_sort ? BTGreaterStrategyNumber : BTLessStrategyNumbermakePathKey(strategy)  在执行计划中将min/max映射成的keypath信息保存下来

      2. 生成索引路径的时候,根据keypath的信息生成顺序扫描路径还是逆序扫描路径,主要代码如下所示:

build_index_pathsif(useful_pathkeys != NIL) {ipath = create_index_path(index_is_ordered ? ForwardScanDirection : NoMovementScanDirection) // 首先生成正向的扫描路径}index_pathkeys = build_index_pathkeys  useful_pathkeys = truncate_useless_pathkeys // 将索引的keypath和查询中的keypath做交集,如果有交集,则再生成逆序的扫描路径if(useful_pathkeys != NIL) {ipath = create_index_path(BackwardScanDirection) // 建立反向扫描的index     }

     3.  add_path的时候将带有pathkey的路径保存下来,主要代码流程如下所示:

add_pathcostcmp = compare_path_costs_fuzzilykeyscmp = compare_pathkeys// 如下通过case判断如果执行计划或者keypath 有一个占优势的执行路径都会被保留

三.  min/max 的区别

      min/max算子均走上述流程,其差异主要为当是min算子时候,build_index_paths中truncate_useless_pathkeys裁剪后的keypath为空,导致不会生成逆序扫描的执行计划。主要代码如下所示:

truncate_useless_pathkeyspathkeys_useful_for_orderingpathkeys_contained_incompare_pathkeysif (pathkey1->pk_strategy != pathkey2->pk_strategy) {  // 因为索引的顺序是升序的,但是min算子对应的operator算子是降序的,因此才减掉此keypath,但是对于max算子,顺序是一致的,因此会保留此keypathreturn PATHKEYS_DIFFERENT}
if (nuseful == 0)return NIL;   // 返回空空将不会创建反序列的路径

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

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

相关文章

迈威通信MaxGate800系列工业边缘计算网关,算力硬核中枢的巅峰之作

随着人们对工业物联网领域的深入了解与实践&#xff0c;越来越多的企业开始寻求将计算业务从云端迁移至网络边缘处理与执行。然而&#xff0c;在实际应用中&#xff0c;开发者面临着诸多挑战。为了解决这些问题&#xff0c;迈威通信MaxGate800系列工业智能网关应运而生。 MaxG…

《自动机理论、语言和计算导论》阅读笔记:p139-p171

《自动机理论、语言和计算导论》学习第 7 天&#xff0c;p139-p171总结&#xff0c;总计 33 页。 一、技术总结 1.reversal p139, The reversal of a string a1a2…an is the string written backwards, that is anan-1…a1. 2.homomorphism A string homomorphism is a f…

错题记录-华为海思

华为 海思数字芯片 参考 &#xff1a;FPGA开发/数字IC笔试系列(5) 华为海思IC笔试解析 FPGA开发/数字IC笔试系列(6) 华为海思IC笔试解析 SystemVerilog Function与Task的区别 $readmemh与$readmemb这两个系统任务是用来从指定文件中读取数据到寄存器数组或者RAM、ROM中。除了…

[CSS]使用方式+样式属性

层叠样式表&#xff08;Cascading Style Sheets&#xff09;&#xff0c;与HTML一样&#xff0c;也是一种标记语言&#xff0c;其作用就是给HTML页面标签添加各种样式&#xff0c;定义网页的显示效果&#xff0c;将网页内容和显示样式进行分离&#xff0c;提高了显示功能。简单…

大话设计模式——24.迭代器模式(Iterator Pattern)

简介 提供一种方法顺序访问一个聚合对象中各个元素&#xff0c;而又不暴露该对象的内部实现。&#xff08;Java中使用最多的设计模式之一&#xff09; UML图 应用场景 Java的集合对象&#xff1a;Collection、List、Map、Set等都有迭代器Java ArrayList的迭代器源码 示例 简…

【网站项目】摄影竞赛小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

设计模式——迭代器模式15

迭代器模式提供一种方法访问一个容器对象中各个元素&#xff0c;而又不需暴露该对象的内部细节。 设计模式&#xff0c;一定要敲代码理解 抽象迭代器 /*** 迭代抽象* */ public interface Iterator<A> {A next();boolean hasNext(); }迭代器实现 /*** author ggbond*…

(N-149)基于微信小程序网上商城系统

开发工具&#xff1a;IDEA、微信小程序 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 前端技术&#xff1a;vue、uniapp 服务端技术&#xff1a;springbootmybatisredis 本系统分微信小程序和管理后台两部分&a…

【Linux】应用层协议:HTTP

URL 在之前的文章中我们实现了一个网络版本的计算器&#xff0c;在那个计算器中揉合了协议定制以及序列化反序列化的内容&#xff0c;我们当时也自己定制了一套协议标准&#xff0c;比如请求和响应的格式应该是什么&#xff1f;如何读到一个完整的报文&#xff1f;支持的运算符…

ccframe系统的链路追踪,用户ID追踪的实现

需求 之前ccframe cloud V1用的是springcloud微服务&#xff0c;只需要在header将jwttoken一直传下去就没事&#xff0c;最近弄V2转dubbo发现用户id没有自动保存进数据库表。于是开始研究dubbo如何追踪&#xff0c;顺便把链路追踪ID的问题给一并解决掉。 理论 MDC MDC&…

在 Elasticsearch 中扩展 ML 推理管道:如何避免问题并解决瓶颈

作者&#xff1a;来自 Elastic Iulia Feroli 是时候考虑语义搜索运营了吗&#xff1f; 无论你是一位经验丰富的搜索工程师&#xff0c;希望探索新的人工智能功能&#xff0c;还是一位机器学习专家&#xff0c;希望更多地利用搜索基础设施来增强语义相似性模型 —— 充分利用这…

anaconda创建了虚拟python环境,且安装了pytorch,但是pycharm中import torch运行时报错

报错如下&#xff1a; C:\Users\tashi\.conda\envs\test1\python.exe D:\project\python\transformer\main.py C:\Users\tashi\.conda\envs\test1\lib\site-packages\numpy\__init__.py:127: UserWarning: mkl-service package failed to import, therefore Intel(R) MKL init…