ORCA优化器浅析——CDXLScalarFilter Class for DXL filter operators

news2024/12/23 14:42:40

在这里插入图片描述

CDXLScalarFilter

CDXLScalarFilter为Class for representing DXL filter operators。CDXLScalarFilter相对于CDXLScalar没有增加其他数据成员。

class CDXLScalarFilter : public CDXLScalar{
private: CDXLScalarFilter(CDXLScalarFilter &); // private copy ctor
public:	
	explicit CDXLScalarFilter(CMemoryPool *mp); // ctor/dtor	
	Edxlopid GetDXLOperator() const; // accessors
	const CWStringConst *GetOpNameStr() const;
	// serialize operator in DXL format
	virtual void SerializeToDXL(CXMLSerializer *xml_serializer, const CDXLNode *node) const;
	// conversion function
	static CDXLScalarFilter *Cast(CDXLOperator *dxl_op) { return dynamic_cast<CDXLScalarFilter *>(dxl_op); }

	// does the operator return a boolean result
	virtual BOOL HasBoolResult(CMDAccessor *	 //md_accessor) const { return false; }
};

CDXLScalarFilter类有三个子类,它们的成员函数和CDXLScalarFilter父类一致:

  • class CDXLScalarJoinFilter : public CDXLScalarFilter Class for representing DXL join condition operators
  • class CDXLScalarOneTimeFilter : public CDXLScalarFilter Class for representing DXL filter operators
  • class CDXLScalarRecheckCondFilter : public CDXLScalarFilter Filter for rechecking an index condition on the operator upstream of the bitmap index scan
    在这里插入图片描述

CreateFilterFromQual

CreateFilterFromQual函数是定义在src/include/gpopt/translate/CTranslatorScalarToDXL.h的CTranslatorScalarToDXL类的成员函数,用于create a DXL scalar filter node from a GPDB qual list。但是该函数在greeplum使用orca优化器流程中都没有调用,因为ScalarFilter是在Expr Tree转化为DXL Tree的流程中创建的,而非在QueryToDXL流程中调用,因此Query树中的qual表达式是被转化为其他CDXLScalar子类,而不是CDXLScalarFilter。

//---------------------------------------------------------------------------
//	@function:
//		CTranslatorScalarToDXL::CreateFilterFromQual
//	@doc:
//		Create a DXL scalar filter node from a GPDB qual list.
//		The function allocates memory in the translator memory pool, and the caller
//		is responsible for freeing it
//---------------------------------------------------------------------------
CDXLNode *CTranslatorScalarToDXL::CreateFilterFromQual(List *quals, const CMappingVarColId *var_colid_mapping, Edxlopid filter_type) {
	CDXLScalarFilter *dxlop = NULL;
	switch (filter_type) {
		case EdxlopScalarFilter: dxlop = GPOS_NEW(m_mp) CDXLScalarFilter(m_mp); break;
		case EdxlopScalarJoinFilter: dxlop = GPOS_NEW(m_mp) CDXLScalarJoinFilter(m_mp); break;
		case EdxlopScalarOneTimeFilter: dxlop = GPOS_NEW(m_mp) CDXLScalarOneTimeFilter(m_mp); break;
		default: GPOS_ASSERT(!"Unrecognized filter type");
	}

	CDXLNode *filter_dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, dxlop); // 创建CDXLNode,m_dxl_op设置为dxlop
	CDXLNode *cond_node = CreateScalarCondFromQual(quals, var_colid_mapping);
	if (NULL != cond_node){ filter_dxlnode->AddChild(cond_node); // 将子节点添加到m_dxl_array }

	return filter_dxlnode;
}

CreateScalarCondFromQual函数从GPDB qual列表创建DXL标量布尔运算符节点。Create a DXL scalar boolean operator node from a GPDB qual list. The function allocates memory in the translator memory pool, and the caller is responsible for freeing it. 其最终流程就是调用CTranslatorScalarToDXL类的TranslateScalarToDXL函数(Create a DXL node for a scalar expression from a GPDB expression node.)。

//---------------------------------------------------------------------------
//	@function:
//		CTranslatorScalarToDXL::CreateScalarCondFromQual
//	@doc:
//		Create a DXL scalar boolean operator node from a GPDB qual list.
//		The function allocates memory in the translator memory pool, and the caller
//		is responsible for freeing it
//---------------------------------------------------------------------------
CDXLNode *CTranslatorScalarToDXL::CreateScalarCondFromQual(List *quals, const CMappingVarColId *var_colid_mapping) {
	if (NULL == quals || 0 == gpdb::ListLength(quals)){ return NULL; }

	if (1 == gpdb::ListLength(quals)) {
		Expr *expr = (Expr *) gpdb::ListNth(quals, 0);
		return TranslateScalarToDXL(expr, var_colid_mapping);
	}else{
		// GPDB assumes that if there are a list of qual conditions then it is an implicit AND operation Here we build the left deep AND tree
		CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarBoolExpr(m_mp, Edxland));
		TranslateScalarChildren(dxlnode, quals, var_colid_mapping);

		return dxlnode;
	}
}
//---------------------------------------------------------------------------
//	@function:
//		CTranslatorScalarToDXL::TranslateScalarChildren
//	@doc:
//		Translate list elements and add them as children of the DXL node
//---------------------------------------------------------------------------
void CTranslatorScalarToDXL::TranslateScalarChildren(CDXLNode *dxlnode, List *list, const CMappingVarColId *var_colid_mapping) {
	ListCell *lc = NULL;
	ForEach(lc, list){
		Expr *child_expr = (Expr *) lfirst(lc);
		CDXLNode *child_node = TranslateScalarToDXL(child_expr, var_colid_mapping);
		dxlnode->AddChild(child_node);
	}
}

CTranslatorExprToDXL

CDXLScalarFilter及其子类在CTranslatorExprToDXL流程中实例化,调用流程如下所示。
CDXLScalarFilter类的创建流程:

  • CTranslatorExprToDXL类的PdxlnResultFromFilter函数用于Create a DXL result node from an optimizer filter node
  • CTranslatorExprToDXL类的PdxlnAggregate函数用于Create a DXL aggregate node from an optimizer agg expression
  • CTranslatorExprToDXL类的PdxlnFilter函数用于Create a DXL filter node containing the given scalar node as a child. If the scalar node is NULL, a filter node with no children is returned

CDXLScalarJoinFilter类的创建流程:

  • CTranslatorExprToDXL类的PdxlnNLJoin函数用于Create a DXL nested loop join node from an optimizer nested loop join expression
  • CTranslatorExprToDXL类的PdxlnMergeJoin函数
  • CTranslatorExprToDXL类的PdxlnHashJoin函数用于Create a DXL hash join node from an optimizer hash join expression

CDXLScalarOneTimeFilter类的创建流程:

  • CTranslatorExprToDXL类的PdxlnAddScalarFilterOnRelationalChild函数
  • CTranslatorExprToDXL类的PdxlnResultFromFilter函数用于Create a DXL result node from an optimizer filter node.
  • CTranslatorExprToDXL类的PdxlnResultFromConstTableGet函数用于Create a DXL result node from an optimizer const table get node
  • CTranslatorExprToDXL类的PdxlnRestrictResult函数用于Helper to build a Result expression with project list restricted to required column
  • CTranslatorExprToDXL类的PdxlnProjectBoolConst函数用于Helper to add a project of bool constant on top of given DXL node
  • CTranslatorExprToDXL类的PdxlnBooleanScalarWithSubPlan函数用于Construct a boolean scalar dxl node with a subplan as its child. The sublan has a boolean output column, and has the given relational child under it
  • CTranslatorExprToDXL类的PdxlnResult函数用于A wrapper around CTranslatorExprToDXLUtils::PdxlnResult to check if the project list imposes a motion hazard, eventually leading to a deadlock. If yes, add a Materialize on the Result child to break the deadlock cycle

CDXLScalarRecheckCondFilter类的创建流程:

  • CTranslatorExprToDXL类的PdxlnBitmapTableScan函数用于Create a DXL physical bitmap table scan from an optimizer physical bitmap table scan operator.
  • CTranslatorExprToDXL类的PdxlnDynamicBitmapTableScan函数用于Create a DXL dynamic bitmap table scan node from an optimizer dynamic bitmap table scan node.

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

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

相关文章

初识C语言(3)

什么是C语言 1.第一个C语言程序 2.数据类型 3.变量、常量 4.字符串转义字符注释 5.选择语句 6.循环语句 7.函数 8.数组 9.操作符 10.常见关键字 11.define 定义常量和宏 12.指针 13.结构体 这一篇文章我们从常见关键字开始说起&#xff0c;也是…

[PaddlePaddle] [学习笔记] [上] 计算机视觉(卷积、卷积核、卷积计算、padding计算、BN、缩放、平移、Dropout)

1. 计算机视觉的发展历程 计算机视觉作为一门让机器学会如何去“看”的学科&#xff0c;具体的说&#xff0c;就是让机器去识别摄像机拍摄的图片或视频中的物体&#xff0c;检测出物体所在的位置&#xff0c;并对目标物体进行跟踪&#xff0c;从而理解并描述出图片或视频里的场…

2023年国赛数学建模思路 - 复盘:人力资源安排的最优化模型

文章目录 0 赛题思路1 描述2 问题概括3 建模过程3.1 边界说明3.2 符号约定3.3 分析3.4 模型建立3.5 模型求解 4 模型评价与推广5 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 描述 …

Spring 使用注解开发、代理模式、AOP

使用注解开发 在Spring4之后&#xff0c;要使用注解开发&#xff0c;必须要保证AOP的包导入了 项目搭建&#xff1a; 在配置文件中导入约束&#xff0c;增加注解支持 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.spri…

LangChain手记 Memory

整理并翻译自DeepLearning.AILangChain的官方课程&#xff1a;Memory Memory 使用open ai的API调用GPT都是单次调用&#xff0c;所以模型并不记得之前的对话&#xff0c;多轮对话的实现其实是将前面轮次的对话过程保留&#xff0c;在下次对话时作为输入的message数组的一部分&…

6.1 安全漏洞与网络攻击

数据参考&#xff1a;CISP官方 目录 安全漏洞及产生原因信息收集与分析网络攻击实施后门设置与痕迹清除 一、安全漏洞及产生原因 什么是安全漏洞 安全漏洞也称脆弱性&#xff0c;是计算机系统存在的缺陷 漏洞的形式 安全漏洞以不同形式存在漏洞数量逐年递增 漏洞产生的…

python编程小游戏简单的,python小游戏编程100例

大家好&#xff0c;给大家分享一下python编程小游戏简单的&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 不会python就不能用python开发入门级的小游戏&#xff1f; 当然不是&#xff0c;我收集了十个python入门小游戏的源码和教程&#…

基于Yolov5与LabelImg训练自己数据的完整流程

基于Yolov5与LabelImg训练自己数据的完整流程 1. 创建虚拟环境2. 通过git 安装 ultralytics3. 下载yolov54. 安装labelImg标注软件5. 使用labelImg进行标注&#xff0c;图片使用上面的coco1285.1 点击“打开目录”选择存储图像的文件夹进行标注&#xff0c;右下角会出现图像列表…

用 React+ts 实现无缝滚动的走马灯

一、走马灯的作用 走马灯是一种常见的网页交互组件&#xff0c;可以展示多张图片或者内容&#xff0c;通过自动播放或者手动切换的方式&#xff0c;让用户能够方便地浏览多张图片或者内容。 本次实现的不是轮播图而是像传送带一样的无限滚动的形式。 二、需求梳理 走马灯可设…

MySQL中的锁机制

抛砖引玉&#xff1a;多个查询需要在同一时刻进行数据的修改&#xff0c;就会产生并发控制的问题。我们需要如何避免写个问题从而保证我们的数据库数据不会被破坏。 锁的概念 读锁是共享的互相不阻塞的。多个事务在听一时刻可以同时读取同一资源&#xff0c;而相互不干扰。 写…

mysql 习题总结

1.select sex,avg(salsry) as 平均薪资 from emp group by sex; 2.select depart,sum(salsry) from emp group by depart; 3.select depart ,sum(salary) from emp group by depart order by sum(salary) desc limit 1,1; 4.select name from emp group by name having count(n…

NAS搭建指南一——服务器的选择与搭建

一、服务器的选择 有自己的本地的公网 IP 的请跳过此篇文章按需求选择一个云服务器&#xff0c;目的就是为了进行 frp 的搭建&#xff0c;完成内网穿透我选择的是腾讯云服务器&#xff0c;我的配置如下&#xff0c;仅供参考&#xff1a; 4. 腾讯云服务器官网地址 二、服务器…

Axure RP移动端高保真CRM办公客户管理系统原型模板及元件库

Axure RP移动端高保真CRM办公客户管理系统原型模板及元件库&#xff0c;一套典型的移动端办公工具型APP Axure RP原型模板&#xff0c;可根据实际的产品需求进行扩展&#xff0c;也可以作为移动端原型设计的参考案例。为提升本作品参考价值&#xff0c;在模板设计过程中尽量追求…

Docker简介与安装步骤

Docker简介与安装步骤 一、Docker简介 1、是什么&#xff1f; 解决了运行环境和配置问题的软件容器&#xff0c; 方便做持续集成并有助于整体发布的容器虚拟化技术。 问题&#xff1a;为什么会有docker出现 假定您在开发一个项目&#xff0c;您使用的是一台笔记本电脑而且您…

Vue+ElementUI实现选择指定行导出Excel

这里记录一下&#xff0c;今天写项目时 的一个需求&#xff0c;就是通过复选框选中指定行然后导出表格中选中行的Excel表格 然后这里介绍一个工具箱(模板)&#xff1a;vue-element-admin 将它拉取后&#xff0c;运行就可以看到如下界面&#xff1a; 这里面的很多功能都已经实现…

【NLP】训练LLM的不同方式

一、说明 在大型语言模型&#xff08;LLM&#xff09;领域&#xff0c;有各种各样的 训练机制&#xff0c;具有不同的手段&#xff0c;要求和目标。由于它们服务于不同的目的&#xff0c;因此重要的是不要将它们相互混淆&#xff0c;并了解它们适用的不同场景。 在本文中&#…

Docsify侧边栏多级子目录生成

自动生成 docsify 的 sidebar 和 每个子目录中的 sidebar Docsify 官网 网站的部署 Github Page: 国内访问太慢了. 子目录 - [Java](java/) - [设计模式](设计模式/) - [大数据](大数据/)- [presto](大数据/presto/)- [代码阅读](大数据/presto/代码阅读/)- [服务发现](大…

CSS练习

CSS练习 工具代码运行结果 工具 HBuilder X 代码 <!DOCTYPE html> <!-- 做一个表格&#xff0c;6行4列实现隔行换色&#xff08;背景色&#xff09;并且第3列文字红色第一个单元格文字大小30px。最后一个单元格文字加粗--> <html><head><meta ch…

【LeetCode每日一题】——454.四数相加II

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 哈希表 二【题目难度】 中等 三【题目编号】 454.四数相加II 四【题目描述】 给你四个整数…

深度学习笔记(kaggle课程《Intro to Deep Learning》)

一、什么是深度学习&#xff1f; 深度学习是一种机器学习方法&#xff0c;通过构建和训练深层神经网络来处理和理解数据。它模仿人脑神经系统的工作方式&#xff0c;通过多层次的神经网络结构来学习和提取数据的特征。深度学习在图像识别、语音识别、自然语言处理等领域取得了…