ORCA优化器浅析——CQueryContext对优化器的要求

在这里插入图片描述
从ORCA优化器浅析——重要主流程概述中可以知道进入真正优化器引擎执行流程之前需要对优化器提出要求,比如后面会提到的required columns、required sort orders等。而CQueryContext即是承载这些内容的类。首先CQueryContext类是通过PqcGenerate函数构造的,其函数签名如下static CQueryContext *PqcGenerate(CMemoryPool *mp, /* memory pool */ CExpression *pexpr, /* expression representing the query */ ULongPtrArray *pdrgpulQueryOutputColRefId, /* array of output column reference id */ CMDNameArray *pdrgpmdname, /* array of output column names */ BOOL fDeriveStats); // generate the query context for the given expression and array of output column ref ids。其调用处如上图所示,参数为上一个步骤的输出参数,比如expression representing the query EXPR树等。CQueryContext实例将在CEngine::Init流程中被赋值给CEngine的m_pqc成员。

CQueryContext *CQueryContext::PqcGenerate(CMemoryPool *mp, CExpression *pexpr, ULongPtrArray *pdrgpulQueryOutputColRefId, CMDNameArray *pdrgpmdname, BOOL fDeriveStats) {CColRefSet *pcrs = GPOS_NEW(mp) CColRefSet(mp);CColRefArray *colref_array = GPOS_NEW(mp) CColRefArray(mp);COptCtxt *poptctxt = COptCtxt::PoctxtFromTLS();CColumnFactory *col_factory = poptctxt->Pcf();// Collect required column references (colref_array)const ULONG length = pdrgpulQueryOutputColRefId->Size();for (ULONG ul = 0; ul < length; ul++) {ULONG *pul = (*pdrgpulQueryOutputColRefId)[ul];CColRef *colref = col_factory->LookupColRef(*pul);pcrs->Include(colref);colref_array->Append(colref);}// Collect required properties (prpp) at the top level:// By default no sort order requirement is added, unless the root operator in// the input logical expression is a LIMIT. This is because Orca always// attaches top level Sort to a LIMIT node.COrderSpec *pos = NULL; CExpression *pexprResult = pexpr; COperator *popTop = PopTop(pexpr);if (COperator::EopLogicalLimit == popTop->Eopid()){// top level operator is a limit, copy order spec to query contextpos = CLogicalLimit::PopConvert(popTop)->Pos();pos->AddRef();}else{		pos = GPOS_NEW(mp) COrderSpec(mp); // no order required}CDistributionSpec *pds = NULL;BOOL fDML = CUtils::FLogicalDML(pexpr->Pop());poptctxt->MarkDMLQuery(fDML);// DML commands do not have distribution requirement. Otherwise the// distribution requirement is Singleton.if (fDML){pds = GPOS_NEW(mp) CDistributionSpecAny(COperator::EopSentinel);}else{pds = GPOS_NEW(mp) CDistributionSpecSingleton(CDistributionSpecSingleton::EstMaster);}// By default, no rewindability requirement needs to be satisfied at the top levelCRewindabilitySpec *prs = GPOS_NEW(mp) CRewindabilitySpec(CRewindabilitySpec::ErtNone, CRewindabilitySpec::EmhtNoMotion);// Ensure order, distribution and rewindability meet 'satisfy' matching at the top levelCEnfdOrder *peo = GPOS_NEW(mp) CEnfdOrder(pos, CEnfdOrder::EomSatisfy);CEnfdDistribution *ped =GPOS_NEW(mp) CEnfdDistribution(pds, CEnfdDistribution::EdmSatisfy);CEnfdRewindability *per =GPOS_NEW(mp) CEnfdRewindability(prs, CEnfdRewindability::ErmSatisfy);// Required CTEs are obtained from the CTEInfo global information in the optimizer contextCCTEReq *pcter = poptctxt->Pcteinfo()->PcterProducers(mp);// NB: Partition propagation requirements are not initialized here.  They are// constructed later based on derived relation properties (CPartInfo) by// CReqdPropPlan::InitReqdPartitionPropagation().CReqdPropPlan *prpp = GPOS_NEW(mp) CReqdPropPlan(pcrs, peo, ped, per, pcter);// Finally, create the CQueryContextpdrgpmdname->AddRef();return GPOS_NEW(mp) CQueryContext(mp, pexprResult, prpp, colref_array, pdrgpmdname, fDeriveStats);
}

在这里插入图片描述
其实还有对CQueryContext类实例化的调用为CPhysical::PrpCreate(CMemoryPool *mp) { return GPOS_MEM(mp)CReqdPropRelational(); },主要用于Create base container of required properties。主要用于CExpressionHandle的ComputeChildReqProps和ComputeChildReqdCols函数为非Scalar孩子节点创建存放需求属性的实例,也就是CReqdPropRelational。CReqdPropRelational和CReqdPropPlan是CReqdProp的子类,这在后续内容中会体现出来。
在这里插入图片描述
在这里插入图片描述

由于CQueryContext实例将在CEngine::Init流程中被赋值给CEngine的m_pqc成员,所以CQueryContext对优化器的要求也将由CEngine管理,通过对m_pqc的跟踪,其主要调用的函数是m_pqc->Prpp()m_pqc->FDeroveStats,这里仅观察m_pqc->Prpp()函数。其中最重要的是*CEngince::Optmize函数将CReqdPrpPlan m_prpp成员委托给了COptimizationContext类,如下代码所示,由此印证了其功能为Optimization context object stores properties required to hold on the plan generated by the optimizer,而CReqdPropPlan *m_prpp; // required plan properties仅仅是COptimizationContext类的一个成员,还有其他properties需要优化器去关注。其他调用m_pqc->Prpp()函数函数流程都是优化后的执行计划提取相关,将在Counting, Enumerating, and Sampling of Execution Plans in a Cost-Based Query Optimizer论文分析之后说明。
在这里插入图片描述

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

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

相关文章

MySQL进阶--性能分析

目录 一、简介二、什么的SQL性能分析三、性能分析的方式1.SQL执行频率2.慢查询日志3.profile详情4.explain执行计划 PS: 一、简介 本文的内容讲的是MySQL的性能分析&#xff0c;包括执行频率、慢查询日志、profile详情和explain执行计划~ 二、什么的SQL性能分析 SQL性能分析…

使用Golang实现一套流程可配置,适用于广告、推荐系统的业务性框架——简单应用

在诸如广告、推荐等系统中&#xff0c;我们往往会涉及过滤、召回和排序等过程。随着系统业务变得复杂&#xff0c;代码的耦合和交错会让项目跌入难以维护的深渊。于是模块化设计是复杂系统的必备基础。这篇文章介绍的业务框架脱胎于线上多人协作开发、高并发的竞价广告系统&…

MySQL|查看事务加锁情况

文章目录 使用information_schema数据库中的表获取锁信息INNODB_TRXINNODB_LOCKSINNODB_LOCK_WAITS 使用SHOW ENGINE INNODB STATUS获取信息补充 使用information_schema数据库中的表获取锁信息 在information_schema数据库中&#xff0c;有几个与事务和锁紧密相关的表 INNOD…

任务15、MidJourney视频(Video)参数动态上线,制作惊艳动画短片

15.1 任务概述 本次任务将帮助你掌握Midjourney中的Video参数,并利用这些参数创作出令人惊艳的绘画作品。通过学习Video参数的基本概念和功能,以及案例的实际应用,你将学会如何正确设置和调整这些参数,从而达到你所期望的绘画效果。最终,你将运用所学知识,生成香奈儿模特…

OpenCV之信用卡识别实战

文章目录 代码视频讲解模板匹配文件主程序(ocr_template_match.py)myutils.py 代码 链接: https://pan.baidu.com/s/1KjdiqkyYGfHk97wwgF-j3g?pwdhhkf 提取码: hhkf 视频讲解 链接: https://pan.baidu.com/s/1PZ6w5NcSOuKusBTNa3Ng2g?pwd79wr 提取码: 79wr 模板匹配文件 …

使用JProfiler进入JVM分析

要评测JVM&#xff0c;必须将JProfiler的评测代理加载到JVM中。这可以通过两种不同的方式发生&#xff1a;在启动脚本中指定-agentpath VM参数&#xff0c;或者使用attach API将代理加载到已经运行的JVM中。 JProfiler支持这两种模式。添加VM参数是评测的首选方式&#xff0c;集…

ChatGPT在工作中的七种用途

1. 用 ChatGPT 替代谷歌搜索引擎 工作时&#xff0c;你一天会访问几次搜索引擎&#xff1f;有了 ChatGPT&#xff0c;使用搜索引擎的频率可能大大下降。 据报道&#xff0c;谷歌这样的搜索引擎巨头&#xff0c;实际上很担心用户最终会把自己的搜索工具换成 ChatGPT。该公司针对…

服务器出入口IP通俗理解

一、出口IP 这是机房的网络设备&#xff08;如防火墙&#xff09;给内网主机生成的一个外网IP&#xff0c;用来保证内网主机能和其他公网主机进行来回通信&#xff0c;通常作为其他接入方的IP白名单使用&#xff0c;一般有几台内网主机就有几个出口IP&#xff0c;出口IP通常和入…

想写几个上位机,是选择学c#还是 c++ qt呢?

C#基本也就上位机开发开发&#xff0c;另外做做日常用的小工具很方便。 结合PLC&#xff0c;以太网做上位机&#xff0c;这个基本上控制这块都比较有需求。 另外我们用C#也做一些工具的二次开发&#xff0c;感觉还行。 C用qt框架其实学习起来可能稍微复杂些&#xff0c;但是…

【STM32零基础入门教程03】GPIO输入输出之GPIO框图分析

本章节主要讲解点亮LED的基本原理&#xff0c;以及GPIO框图的讲解。 如何点亮LED&#xff08;输出&#xff09; 首先我们查看原理图&#xff0c;观察电路图中LED的连接情况&#xff0c;如下图可以看出我们的板子中LED一端通过限流电阻连接的PB0另一端连接的是高电平VCC&#xf…

visio,word添加缺少字体,仿宋_GB2312、楷体_GB2312、方正小标宋简体等字体下载

一. 内容简介 visio,word添加缺少字体,仿宋_GB2312、楷体_GB2312、方正小标宋简体等字体下载 二. 软件环境 2.1 visio 三.主要流程 3.1 下载字体 http://www.downza.cn/ 微软官方给的链接好多字体没有&#xff0c;其他好多字体网站&#xff0c;就是给你看个样式&#xff…

【具有非线性反馈的LTI系统识别】针对反馈非线性的LTI系统,提供非线性辨识方案(SimulinkMatlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…