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

在这里插入图片描述

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.mfbz.cn/a/72463.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue 中使用 WebWorker

目录 安装 loader 应用场景 打包时错误处理 安装 loader npm install worker-loader -D 如果直接把worker.js放到public目录下&#xff0c;则不需要安装loader vue.config.js const { defineConfig } require(vue/cli-service)module.exports defineConfig({transpileDe…

2023-08-13 LeetCode每日一题(合并两个有序数组)

2023-08-13每日一题 一、题目编号 88. 合并两个有序数组二、题目链接 点击跳转到题目位置 三、题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 …

【推荐系统】wss课程-排序

排序01-多目标模型 这节课的内容是推荐系统排序的多目标模型。这节课的内容分两部分。 - 第一部分是模型结构。模型把用户特征、物品特征、统计特征、场景特征作为输入&#xff0c;输出对多个指标的预估。 - 第二部分内容是降采样和校准。在实际的推荐系统中&#xff0c;正负…

29 | 广州美食店铺数据分析

广州美食店铺数据分析 一、数据分析项目MVP加/价值主张宣言 随着经济的快速发展以及新媒体的兴起,美食攻略、美食探店等一系列东西进入大众的眼球,而人们也会在各大平台中查找美食推荐,因此本项目做的美食店铺数据分析也是带有可行性的。首先通过对广东省的各市美食店铺数量…

Docker高级篇_DockerFile

目录 DockerFile简介构建DockerFile构建过程解析Docker执行Dockerfile的大致流程 DockerFile常用保留字指令FROMMAINTAINERRUNEXPOSEWORKDIRUSERENVVOLUMEADDCOPYCMDENTRYPOINT案例使用虚悬镜像 Docker微服务 DockerFile简介 Dockerfile是用来构建Docker镜像的文本文件&#x…

Java学习手册——第一篇Java简介

今后Java学习手册就来给大家梳理JavaSE的基础知识啦&#xff0c; 除了这个专栏我们还有其他专栏&#xff1a;前端、安全、后端等。 希望大家可以在这里一起讨论学习哟~ Java学习手册——第一篇Java简介 1. Java基础知识2. Java能干嘛3. Java基础环境搭建 1. Java基础知识 出生…

Ae 效果:CC Environment

透视/CC Environment Perspective/CC Environment CC Environment&#xff08;CC 环境&#xff09;主要用于创建 3D 环境映射&#xff0c;可以将一个 2D 图像转换为 3D 空间的反射或折射。该效果通常用于模拟真实世界的全景相机镜头和环境反射。 在实际操作中&#xff0c;可将效…

【解析postman工具的使用(基础篇】

postman前端请求详解 主界面1.常见类型的接口请求1.1 查询参数的接口请求1.1.1 什么是查询参数?1.1.2 postman如何请求 1.2 ❤表单类型的接口请求1.2.1 复习下http请求1.2.2❤ 什么是表单 1.3 上传文件的表单请求1.4❤ json类型的接口请求 2. 响应接口数据分析2.1 postman的响…

UG NX二次开发(C#)-CAM-获取刀具类型

文章目录 1、前言2、UG NX中的刀具类型3、获取刀具类型3.1 刀具类型帮助文档1、前言 在UG NX的加工模块,加工刀具是一个必要的因素,其包括了多种类型的类型,有铣刀、钻刀、车刀、磨刀、成型刀等等,而且每种刀具所包含的信息也各不相同。想获取刀具的信息,那就要知道刀具的…

Docker简介与安装步骤

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

SQL server 异地备份数据库

异地备份数据库 1.备份服务器中设置共享文件夹 2.源服务器数据库中添加异地备份代理作业 EXEC sp_configure show advanced options, 1;RECONFIGURE; EXEC sp_configure xp_cmdshell, 1;RECONFIGURE; declare machine nvarchar(50) 192.168.11.10 --服务器IP declare pa…

RT-Thread Smart 用户态开发体验

背景 RT-Thread Smart 是基于 RT-Thread 操作系统上的混合操作系统&#xff0c;它把应用从内核中独立出来&#xff0c;形成独立的用户态应用程序&#xff0c;并具备独立的地址空间。 自 V5.0.0 起&#xff0c;rt-smart 分支已合并至 master 分支上&#xff0c;下载 rt-thread …

最强自动化测试框架Playwright(26)-对话框

page.on(dialog) playwright 框架可以监听dialog事件&#xff0c;不管你alert 什么时候弹出来&#xff0c;监听到事件就自动处理了。 当出现 JavaScript 对话框时发出&#xff0c;例如alert、prompt或。侦听器必须dialog.accept()或dialog.dismiss()对话框 - 否则页面将冻结等…

YOLOv5、YOLOv8改进:MobileViT:轻量通用且适合移动端的视觉Transformer

MobileViT: Light-weight, General-purpose, and Mobile-friendly Vision Transformer 论文&#xff1a;https://arxiv.org/abs/2110.02178 1简介 MobileviT是一个用于移动设备的轻量级通用可视化Transformer&#xff0c;据作者介绍&#xff0c;这是第一次基于轻量级CNN网络性…

获取接口的所有实现

一、获取接口所有实现类 方法1&#xff1a;JDK自带的ServiceLoader实现 ServiceLoader是JDK自带的一个类加载器&#xff0c;位于java.util包当中&#xff0c;作为 A simple service-provider loading facility。 &#xff08;1&#xff09;创建接口 package com.example.dem…

Elasticsearch 8.X 复杂分词搞不定,怎么办?

1、实战问题 球友提问&#xff1a;我想停用所有纯数字的分词 &#xff0c; 官网上的这个方法好像对ik分词器无效&#xff01; 有没有什么别的方法啊&#xff0c; chart gpt 说分词可以用正则匹配 但是测试好像是不行的 我的es版本是 8.5.3。 2、进一步沟通后&#xff0c;得…

迪瑞克斯拉算法 — 优化

在上一篇迪瑞克斯拉算法中将功能实现了出来&#xff0c;完成了图集中从源点出发获取所有可达的点的最短距离的收集。 但在代码中getMinDistanceAndUnSelectNode()方法的实现并不简洁&#xff0c;每次获取minNode时&#xff0c;都需要遍历整个Map&#xff0c;时间复杂度太高。这…

TypeScript 语法

环境搭建 以javascript为基础构建的语言&#xff0c;一个js的超集&#xff0c;可以在任何支持js的平台中执行&#xff0c;ts扩展了js并且添加了类型&#xff0c;但是ts不能被js解析器直接执行&#xff0c;需要编译器编译为js文件&#xff0c;然后引入到 html 页面使用。 ts增…

Git Cherry-pick使用

概述 无论项目大小&#xff0c;当你和一群程序员一起工作时&#xff0c;处理多个 Git 分支之间的变更都会变得很困难。有时&#xff0c;与其把整个 Git 分支合并到另一个分支&#xff0c;不如选择并移动几个特定的提交。这个过程被称为 "挑拣", 即 Cherry-pick。 本…

使用QT纯代码创建(查找)对话框详细步骤与代码

一、创建项目文件 打开Qt Creator->文件->新建文件或项目->选择Qt Widgets Application 为项目起名字 输入类的名字 二、 了解每个文件的作用 项目创建完毕之后就会出现以下几个文件&#xff0c;先来分别介绍以下这些文件的作用。 Headers->finddialog.h——很显…
最新文章