ORCA优化器浅析——Exploration and Implementation Apply CXform Phase

news2024/11/25 7:25:18

GPORCA通过规则对表达式做转换,规则分为两类:Exploration,是对逻辑表达式做等价变换的;Implementation,是把逻辑操作符转换为物理操作符。Except the types of operator generated during Exploration (Logical => Logical) and Implementation (Logical => Physical) Phase, the process is similar. There are no Transform / CXform for Optimization Phase, so have excluded it from the below diagram. Will talk about Optimization phase a little later.
由于Exploration和Implementation流程一致,因此合在一起描述主要流程:(本篇文章仅关注第一步和第二步)

  1. Get the Group Expression to optimize
  2. Get the CXform Applicable for it
  3. Xform Pattern directs the Expected Child Group Expression to be extracted from the MEMO for that transform (CXform).
exploration xform pattern code snippet:
CXformExpandNAryJoinDPv2::CXformExpandNAryJoinDPv2(CMemoryPool *mp)
 : CXformExploration(
       // pattern
       GPOS_NEW(mp) CExpression(mp, GPOS_NEW(mp) CLogicalNAryJoin(mp),
                  GPOS_NEW(mp) CExpression(mp, GPOS_NEW(mp) CPatternMultiLeaf(mp)),
                  GPOS_NEW(mp) CExpression(mp, GPOS_NEW(mp) CPatternTree(mp))))
{}
Above exploration pattern represents the below tree shape
+-CLogicalNAryJoin
  |--CPatternMultiLeaf
  +--CPatternTree

implementation xform pattern code snippet:
CXformImplementUnionAll::CXformImplementUnionAll(CMemoryPool *mp)
:  // pattern
CXformImplementation(GPOS_NEW(mp) CExpression(
          mp, GPOS_NEW(mp) CLogicalUnionAll(mp),
                          GPOS_NEW(mp) CExpression(mp, GPOS_NEW(mp) CPatternMultiLeaf(mp))))
{}
Above implementation pattern represents the below tree shape
+--CLogicalUnionAll
   +--CPatternMultiLeaf
  1. Construct the expression tree by pulling out Group Expression from the MEMO matching the pattern. If there is no match, that’s fine, it just means that the transform is not applicable in this case
  2. Apply the ::Transform method of the xform to produce the resulting expressions
  3. Insert the resulting expression back to the MEMO
  4. Newly inserted expressions will be eligible to be pulled if they have PxfsCandidates to be applied, and will go through Step 1 -> 6
                              ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
                              │    6.Insert the resulting Expressions Back to the MEMO                                                                                                                                       │
                              │                                                                                                                                                                                              │
                              │                                                                                                                                                                                              │
                              ▼                                                                                                                                                                                              │
                                                                                                                                                                                                                             │
┌───────────────────────────────┐                                                                                                                                                                                            │
│MEMO                           │                                                                                                                                                                                            │
│                               │                                                                                                                                                                                            │
│                               │                                                                                                                                                                                            │
│  ROOT                         │ 4.Extract the Group Expressions from the MEMO based on                                                                                                                                     │
│ ┌───────────────────────────┐ │    the Xform Pattern                                                                                                                                                                       │
│ │ Group N                   │ │ ◄─────────────────────────────────────────────────────────────────────┐                                                                                                                    │
│ │ Group Expression 1[x x]   │ │                                                                       │                                                                                                                    │
│ │                           ├─┼──────┐                                                                │                                                                                                                    │
│ └───────────────────────────┘ │      │                                                                │                                                                                                                    │
│     .                         │      │                                                                │                                                                                                                    │
│     .                         │      │                                                                │                                                                                                                    │
│     .                         │      │                                                                │                                                                   Possible Number of Outputs >= 0                  │
│ ┌───────────────────────────┐ │      │1. Get the Group Expression                                     │                                                                                                                    │
│ │ Group 2                   │ │      │                                                                │                                                                                                                    │
│ │ Group Expression 2[x x x] │ │      │                                                                │                                                                   ┌─────────────────────────────────────────────┐  │
│ └───────────────────────────┘ │      ▼                                                                │                                                               ┌──►│ Output Logical / Physical Expression Tree 1 ├──┤
│                               │  ┌──────────────────────────────────┐      ┌──────────────────────────┴────────────────────────────┐   ┌───────────────┐              │   └─────────────────────────────────────────────┘  │
│ ┌───────────────────────────┐ │  │                                  │      │                            Xform Pattern              │   │4.Constructed  │              │                                                    │
│ │ Group 1                   │ │  │  Group Expression 2 - Xform 1    ├─────►│  Group Expression [x x x]  C<Operator><Identifier>    │   │   Logical     │     ┌────────┴───────────┐                                        │
│ │ Group Expression 3[x x x] │ │  │                                  │      │                                      +-CPatternLeaf   ├──►│     or        ├────►│   5.Apply Xform    │                                        │       
│ │                           │ │  │  Group Expression 2 - Xform 2    │      │                                      +-CPatternLeaf   │   │   Physical    │     └────────┬───────────┘                                        │
│ └───────────────────────────┘ │  │                                  │      │                                      +-CPatternTree   │   │   Expression  │              │                                                    │
│                               │  │  Group Expression 2 - Xform 3    │      │3.Take the 1st GE - Xform combination and lookup the   │   │               │              │   ┌─────────────────────────────────────────────┐  │
└───────────────────────────────┘  │  (All Combination for GE  )      │      │     child GEs from MEMO based on the Xform Pattern    │   │               │              └──►│ Output Logical / Physical Expression Tree 2 ├──┘
                                   └──────────────────────────────────┘      └──────────────┬────────────────────────────────────────┘   └───────────────┘                  └─────────────────────────────────────────────┘
┌───────────────────────────────┐      ▲                             ▲                      │
│ Xform PxfsCandidates for      │      │                             │                      │
│ operator of Group Expression  │      │                             │                      │
│                               │      │2. Get Exploration           │                      │
│  Exploration:                 │      │          or                 │                      │
│   Xform 1                     │      │   Implementation            └──────────────────────┘
│   Xform 2                     │      │         Xform                   7. Take the next combination
│   Xform 3                     │      │    for the Group
│                               │      │     Expression
│  Implementation:              │ ◄────┘
│   Xform 4                     │
│   Xform 5                     │
│   Xform n                     │
│                               │
└───────────────────────────────┘

CJobGroupExpressionImplementation和CJobGroupExpressionExploration

请添加图片描述
如上图所示导出红线的虚线直角框图就是CJobGroupExpressionImplementation和CJobGroupExpressionExploration任务进行Apply CXform(Get the Group Expression to optimize和Get the CXform Applicable for it)的流程。获取Group Expression就无需解释,其实就是这些任务中的m_pgexpr成员。而Get the CXform Applicable for it流程中,首先需要获取Group Expression中的操作副的规则位图 【每个操作符,都存有自己需要的规则ID构成的规则的子集,这里面包括了逻辑变换和实现变换的规则】,如下代码中的PxfsCandidates就是获取操作符的规则位图,从下图中的CLogicalExternalGet代码中可以看出其规则位图为xform_set->ExchangeSet(cxform::ExfExternalGet2ExternalScan);然后需要和逻辑变换集合或实现变换集合取与【Exploration阶段,拿操作符的规则集和逻辑变换集合取与,得到操作符这个阶段需要的规则;Implementation阶段,拿操作符的规则集和实现变换集合取与,得到操作符这个阶段需要的规则集】,如下图代码CXformFactory::Pxff()->PxfsExploration()CXformFactory::Pxff()->PxfsImplementation()就是获取CXformFactory中的m_pxfsExploration和m_pxfsImplementation,它们分别为bitset of exploration xforms和bitset of implementation xforms。

void CJobGroupExpressionExploration::ScheduleApplicableTransformations(CSchedulerContext *psc) {
	// get all applicable xforms
	COperator *pop = m_pgexpr->Pop();
	CXformSet *xform_set = CLogical::PopConvert(pop)->PxfsCandidates(psc->GetGlobalMemoryPool());

	// intersect them with required xforms and schedule jobs
	xform_set->Intersection(CXformFactory::Pxff()->PxfsExploration());
	xform_set->Intersection(psc->Peng()->PxfsCurrentStage());
	ScheduleTransformations(psc, xform_set);
	xform_set->Release();

	SetXformsScheduled();
}

void CJobGroupExpressionImplementation::ScheduleApplicableTransformations(CSchedulerContext *psc){
	// get all applicable xforms
	COperator *pop = m_pgexpr->Pop();
	CXformSet *xform_set = CLogical::PopConvert(pop)->PxfsCandidates(psc->GetGlobalMemoryPool());

	// intersect them with required xforms and schedule jobs
	xform_set->Intersection(CXformFactory::Pxff()->PxfsImplementation());
	xform_set->Intersection(psc->Peng()->PxfsCurrentStage());
	ScheduleTransformations(psc, xform_set);
	xform_set->Release();

	SetXformsScheduled();
}

在这里插入图片描述
总结概述一下就是:Exploration阶段,拿操作符的规则集和逻辑变换集合取与,得到操作符这个阶段需要的规则;Implementation阶段,拿操作符的规则集和实现变换集合取与,得到操作符这个阶段需要的规则集。
在这里插入图片描述
GPORCA通过规则工程管理规则集,包括Exploration和Implementation。上图中,0和1有8列,表示规则集。为了简单,我们假设CLogicalGet需要的规则ID是4。LogicalGet所在的行,左边的规则集记录了LogicalGet需要的规则。可以看到第四位被设置为1,可以知道LogicalGet需要ID为4的规则进行转换。Exploration所在的行的规则集,表示所有的规则的集合。5,6,7,8位被设置为1,所以Exploration的规则集是ID为{5,6,7,8}的规则集。同样的,Implementation的规则集为{1,2,3,4}

如下代码即是从上述流程中获取交集的xform规则(即是CXform类的子类)集合中遍历CXform类,为表达式m_pgexpr应用对应的xform规则创建CJobTransformation任务。

//---------------------------------------------------------------------------
//	@function:
//		CJobGroupExpression::ScheduleTransformations
//	@doc:
//		Schedule transformation jobs for the given set of xforms
//---------------------------------------------------------------------------
void CJobGroupExpression::ScheduleTransformations(CSchedulerContext *psc, CXformSet *xform_set) {	
	CXformSetIter xsi(*(xform_set)); // iterate on xforms
	while (xsi.Advance()){
		CXform *pxform = CXformFactory::Pxff()->Pxf(xsi.TBit());
		CJobTransformation::ScheduleJob(psc, m_pgexpr, pxform, this);
	}
}

CJobTransformation

如下为CJobTransformation任务实际执行的函数,其从类成员中获取到表达式和规则,并调用表达式的Transform方法实现【Xform Pattern directs the Expected Child Group Expression to be extracted from the MEMO for that transform (CXform);Construct the expression tree by pulling out Group Expression from the MEMO matching the pattern. If there is no match, that’s fine, it just means that the transform is not applicable in this case;Apply the ::Transform method of the xform to produce the resulting expressions】,最终Insert the resulting expression back to the MEMO。

CJobTransformation::EEvent CJobTransformation::EevtTransform(CSchedulerContext *psc, CJob *pjOwner) {	
	CJobTransformation *pjt = PjConvert(pjOwner); // get a job pointer
	CMemoryPool *pmpGlobal = psc->GetGlobalMemoryPool(); CMemoryPool *pmpLocal = psc->PmpLocal();
	CGroupExpression *pgexpr = pjt->m_pgexpr; CXform *pxform = pjt->m_xform;

    ULONG ulElapsedTime = 0; ULONG ulNumberOfBindings = 0;
	// insert transformation results to memo
	CXformResult *pxfres = GPOS_NEW(pmpGlobal) CXformResult(pmpGlobal);	
	pgexpr->Transform(pmpGlobal, pmpLocal, pxform, pxfres, &ulElapsedTime, &ulNumberOfBindings);
	psc->Peng()->InsertXformResult(pgexpr->Pgroup(), pxfres, pxform->Exfid(), pgexpr, ulElapsedTime, ulNumberOfBindings);
	pxfres->Release();
	
	return eevCompleted;
}

https://github.com/greenplum-db/gpdb/wiki
https://mp.weixin.qq.com/s?__biz=MzA4NjQzNjUyOA==&mid=2650571780&idx=1&sn=1b14e76622cb70b6dd008b4927df8c5f&chksm=87c09bdbb0b712cd8228fab3f2f44fa2aecab0ece6f5d9cdb199efb1ca34bdce58d8f46b92bd&scene=27

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

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

相关文章

手机python怎么用海龟画图,python怎么在手机上编程

大家好&#xff0c;给大家分享一下手机python怎么用海龟画图&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 1、如何python手机版创造Al&#xff1f; 如果您想在手机上使用Python来创建AI&#xff08;人工智能&#xff09;程序&#xff0…

服务器推送、在线游戏和电子邮件背后的网络协议

之前也聊了不少网络协议这块内容&#xff0c;现在我们将深入探讨关键的网络协议及其在不同应用中的作用。重点在于理解这些协议如何塑造我们在互联网上的通信和互动方式。我们将深入研究以下领域&#xff1a; WebSocket 在之前的讨论中&#xff0c;我们研究了HTTP及其在客户端和…

帮助中心客户服务中的作用与应用

随着互联网的快速发展&#xff0c;越来越多的企业开始寻求更加高效、便捷的客户服务方式&#xff0c;帮助中心的自助服务作为一种新型的客户服务模式&#xff0c;受到了广泛关注。本文将针对帮助中心的自助服务在客户服务中的作用与应用进行深入探讨。 帮助中心在客户服务中的…

scrcpy2.0+实时将手机画面显示在屏幕上并用鼠标模拟点击2023.7.26

想要用AI代打手游&#xff0c;除了模拟器登录&#xff0c;也可以直接使用第三方工具Scrcpy&#xff0c;来自github&#xff0c;它是一个开源的屏幕镜像工具&#xff0c;可以在电脑上显示Android设备的画面&#xff0c;并支持使用鼠标进行交互。 目录 1. 下载安装2. scrcpy的高级…

文本预处理——文本数据分析

目录 文本数据分析中文酒店评价语料获得训练集和验证集的标签数量分布获取训练集和验证集的句子长度分布获取训练集和验证集的正负样本长度散点分布获得训练集和验证集不同词汇总数统计获得训练集上正负的样本的高频形容词词云获得验证集上正负的样本的形容词词云 文本数据分析…

Golang指针详解

要搞明白Go语言中的指针需要先知道3个概念&#xff1a;指针地址、指针类型和指针取值。 指针介绍 我们知道变量是用来存储数据的&#xff0c;变量的本质是给存储数据的内存地址起了一个好记的别名。比如我们定义了一个变量 a : 10 ,这个时候可以直接通过 a 这个变量来读取内存…

IPv6 over IPv4

IPv6 over IPv4隧道简介 IPv6 over IPv4隧道可实现IPv6网络孤岛之间通过IPv4网络互连。由于IPv4地址的枯竭和IPv6的先进性&#xff0c;IPv4过渡为IPv6势在必行。因为IPv6与IPv4的不兼容性&#xff0c;所以需要对原有的IPv4设备进行替换。但是如果贸然将IPv4设备大量替换所需成…

明晚直播:可重构计算芯片的AI创新应用分享!

大模型技术的不断升级及应用落地&#xff0c;正在推动人工智能技术发展进入新的阶段&#xff0c;而智能化快速增长和发展的市场对芯片提出了更高的要求&#xff1a;高算力、高性能、灵活性、安全性。可重构计算区别于传统CPU、GPU&#xff0c;以指令驱动的串行执行方式&#xf…

SpringBoot 集成 Elasticsearch

一、版本 spring-boot版本&#xff1a;2.3.7.RELEASEElasticsearch7.8.0版本说明详见 二、Elasticsearch 下载和安装 Elasticsearch 下载 kibana下载 ik分词器下载 配置IK分词器 2.1 解压&#xff0c;在elasticsearch-7.8.0\plugins 路径下新建ik目录 2.2 将ik分词器解压放…

【VB6|第21期】检查SqlServer数据库置疑损坏的小工具(含源码)

日期&#xff1a;2023年7月25日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

Java反射类private私有变量Map并赋值

Java反射类private私有变量Map并赋值 import java.util.LinkedHashMap; import java.util.Map;public class MyObj {private String KEY "NAME";//目标是通过反射在外部访问cacheprivate Map<String, String> cache new LinkedHashMap<>();public MyOb…

mac 删除自带的ABC输入法保留一个搜狗输入法,搜狗配置一下可以减少很多的敲击键盘和鼠标点击次数

0. 背景 对于开发者来说&#xff0c;经常被中英文切换输入法所困扰&#xff0c;我这边有一个方法&#xff0c;删除mac默认的ABC输入法 仅仅保留搜狗一个输入法&#xff0c;配置一下搜狗输入&#xff1a;哪些指定为英文输入&#xff0c;哪些指定为中文输入&#xff08;符号也可…

七、Kafka源码分析之网络通信

1、生产者网络设计 架构设计图 2、生产者消息缓存机制 1、RecordAccumulator 将消息缓存到RecordAccumulator收集器中, 最后判断是否要发送。这个加入消息收集器&#xff0c;首先得从 Deque 里找到自己的目标分区&#xff0c;如果没有就新建一个批量消息 Deque 加进入 2、消…

限幅器(信捷PLC C语言FC功能函数)

关于限幅器的算法介绍,请参考下面博客文章,这里不再赘述,受水平和能力所限文中难免出现错误和不足之处,欢迎大家批评指正。 限幅器算法介绍 PLC信号处理系列之限幅器(Saturation)_RXXW_Dor的博客-CSDN博客TITLE=限幅器VAR_INPUTrX:REAL;// 输出值// 上限到达 FALSE: Up…

RT thread 之 Nand flash 读写过程分析

文章目录 前言&#xff1a;什么是Nand Flash&#xff1f;1、Nand Flash 读取步骤2、从主存读到Cache2.1 在标准spi接口下读取过程2.2 测试时序&#xff08;SPI频率30MHz&#xff09; 3.从Cache读取数据3.1在标准spi接口读取过程测试时序 前言&#xff1a;什么是Nand Flash&…

服务器数据恢复-误操作导致存储VDisk丢失的数据恢复案例

服务器数据恢复环境&#xff1a; IBM某型号存储&#xff1b; Solaris操作系统&#xff0c;部署Oracle数据库。 服务器故障&#xff1a; 重建MDisk导致对应的存储池中的VDisk丢失&#xff0c;导致Solaris操作系统中的Oracle数据库无法使用。 服务器数据恢复过程&#xff1a; 1、…

【如何训练一个中英翻译模型】LSTM机器翻译模型部署之ncnn(python)(五)

系列文章 【如何训练一个中英翻译模型】LSTM机器翻译seq2seq字符编码&#xff08;一&#xff09; 【如何训练一个中英翻译模型】LSTM机器翻译模型训练与保存&#xff08;二&#xff09; 【如何训练一个中英翻译模型】LSTM机器翻译模型部署&#xff08;三&#xff09; 【如何训练…

MTK系统启动流程

MTK系统启动流程 boot rom -> preloader ->lk ->kernel ->Native -> Android 1、Boot rom:系统开机&#xff0c;最先执行的是固化在芯片内部的bootrom&#xff0c;其作用主要有 a.初始化ISRAM和EMMC b.当系统全擦后 &#xff0c;也会配置USB&#xff0c;用来仿…

Android:RecyclerView封装,打造列表极简加载

前言 mBinding.recycler.linear().divider().set<OrdinaryListBean> {addLayout(R.layout.layout_ordinary_item)}.setList(getList()) 如果我要说&#xff0c;除了数据和布局之外&#xff0c;以上的几行代码&#xff0c;就实现了一个列表加载&#xff0c;有老铁会相信…

T形积木(T puzzle)

目录 积木绘制 积木拼接 练习 1. 停止标志 2. 跳跃旋转 3. 小步平移 积木绘制 &#xff08;1&#xff09;复数欧拉公式&#xff1a; &#xff08;2&#xff09;复数的极坐标形式&#xff1a; 其中 &#xff08;3&#xff09;T形积木问题利用了复数乘以将该复数值旋转b角的…