ORCA优化器浅析——QueryToDXL(CDXLLogical+CDXLScalar)主流程

news2024/11/17 9:56:39

Orca是Pivotal数据管理产品的新查询优化器,包括GPDB和HAWQ。Orca是一个基于Cascades操作时序框架的现代自上而下的查询优化器。虽然许多Cascades优化器与其主机系统紧密耦合,但Orca的一个独特功能是它能够作为独立的优化器在数据库系统之外运行。这种能力对于使用一个优化器支持具有不同计算架构(例如MPP和Hadoop)的产品至关重要。它还允许在Hadoop等新的查询处理范式中利用关系优化的广泛遗留问题。此外,将优化器作为一个独立的产品运行,可以在不经过数据库系统的整体结构的情况下进行精细的测试。Orca is the new query optimizer for Pivotal data management products, including GPDB and HAWQ. Orca is a modern top-down query optimizer based on the Cascades optimization framework. While many Cascades optimizers are tightly-coupled with their host systems, a unique feature of Orca is its ability to run outside the database system as a stand-alone optimizer. This ability is crucial to supporting products with different computing architectures (e.g., MPP and Hadoop) using one optimizer. It also allows leveraging the extensive legacy of relational optimization in new query processing paradigms like Hadoop. Furthermore, running the optimizer as a stand-alone product enables elaborate testing without going through the monolithic structure of a database system.
在这里插入图片描述
将优化器与数据库系统解耦需要构建一个处理查询的通信机制。Orca包括一个用于在优化器和数据库系统之间交换信息的框架,称为数据交换语言(DXL)该框架使用基于XML的语言对必要的信息进行编码。Decoupling the optimizer from the database system requires building a communication mechanism to process queries. Orca includes a framework for exchanging information between the optimizer and the database system called Data eXchange Language (DXL). The framework uses an XML-based language to encode the necessary information

用于通信,例如输入查询输出计划元数据。DXL之上是一个简单的通信协议,用于发送初始查询结构和检索优化的计划。DXL的一个主要好处是将Orca打包为一个独立的产品。图2显示了Orca和外部数据库系统之间的交互。Orca的输入是一个DXL查询。奥卡的输出是一个DXL计划。在优化期间,可以向数据库系统查询元数据(例如,表定义)。Orca通过允许数据库系统注册元数据提供者(MD提供者)来抽象元数据访问细节,该提供者负责在将元数据发送到Orca之前将元数据序列化到DXL中。元数据也可以从包含以DXL格式序列化的元数据对象的常规文件中使用。for communication, such as input queries, output plans and metadata. Overlaid on DXL is a simple communication protocol to send the initial query structure and retrieve the optimized plan. A major benefit of DXL is packaging Orca as a stand-alone product. Figure 2 shows the interaction between Orca and an external database system. The input to Orca is a DXL query. The output of Orca is a DXL plan. During optimization, the database system can be queried for metadata (e.g., table definitions). Orca abstracts metadata access details by allowing database system to register a metadata provider (MD Provider) that is responsible for serializing metadata into DXL before being sent to Orca. Metadata can also be consumed from regular files containing metadata objects serialized in DXL format.

数据库系统需要包括使用/发出DXL格式数据的翻译器。Query2DXL翻译器将查询解析树转换为DXL查询,而DXL2Plan翻译器将DXL计划转换为可执行计划。这种翻译器的实现完全在Orca之外完成,这允许多个系统通过提供适当的翻译器来使用Orca。Orca的体系结构具有高度的可扩展性;所有组件都可以单独更换和单独配置。图3显示了奥卡的不同组成部分。我们将这些组件简要描述如下。The database system needs to include translators that consume/emit data in DXL format. Query2DXL translator converts a query parse tree into a DXL query, while DXL2Plan translator converts a DXL plan into an executable plan. The implementation of such translators is done completely outside Orca, which allows multiple systems to use Orca by providing the appropriate translators. The architecture of Orca is highly extensible; all components can be replaced individually and configured separately. Figure 3 shows the different components of Orca. We briefly describe these components as follows.

CTranslatorQueryToDXL

QueryToDXL的主要调用流程在OptimizeTask函数中,主要功能由CTranslatorQueryToDXL类完成,QueryToDXLInstance是CTranslatorQueryToDXL类的工厂函数。CTranslatorQueryToDXL类依赖于元数据访问接口mda和Query查询树执行构造函数,并通过TranslateQueryToDXL这个主要函数进行转换动作的执行。
在这里插入图片描述
CTranslatorQueryToDXL::QueryToDXLInstance作为静态工厂函数,用于Creates a new CTranslatorQueryToDXL object for translating the given top-level query. 注意这里用到了CContextQueryToDXL类。
在这里插入图片描述
src\backend\gpopt\translate\CTranslatorQueryToDXL.cpp CTranslatorQueryToDXL类的实现

  • CTranslatorQueryToDXL.h涉及到的文件CContextQueryToDXL.h + CMappingVarColId.h + CTranslatorScalarToDXL.h + CTranslatorUtils.h + CDXLNode.h
  • CTranslatorQueryToDXL.cpp涉及到的文件CCTEListEntry.h + CQueryMutators.h + CTranslatorDXLToPlStmt.h + CTranslatorRelcacheToDXL.h + CDXLDatumInt8.h + CDXLScalarBooleanTest.h + dxlops.h + dxltokens.h + CMDIdGPDBCtas.h + CMDTypeBoolGPDB.h + IMDAggregate.h + IMDScalarOp.h + IMDTypeBool.h + IMDTypeInt8.h。其重要成员如下所示
    CTranslatorScalarToDXL *m_scalar_translator; // scalar translator used to convert scalar operation into DXL.
    CMappingVarColId *m_var_to_colid_map; // holds the var to col id information mapping
    HMUlCTEListEntry *m_query_level_to_cte_map; // hash map that maintains the list of CTEs defined at a particular query level key: query level value: the list of CTE
    CDXLNodeArray *m_dxl_cte_producers; // list of CTE producers
    UlongBoolHashMap *m_cteid_at_current_query_level_map; // CTE producer IDs defined at the current query level

CTranslatorQueryToDXL::CTranslatorQueryToDXL(CContextQueryToDXL *context, CMDAccessor *md_accessor, const CMappingVarColId *var_colid_mapping, Query *query, ULONG query_level, BOOL is_top_query_dml, HMUlCTEListEntry *query_level_to_cte_map)

  1. CheckSupportedCmdType(query) CheckRangeTable(query) WITH CHECK OPTION views are not supported yet
  2. 如果var_colid_mapping不为null,将var_colid_mapping拷贝为m_var_to_colid_map;否则就直接初始化新的
  3. 如果query_level_to_cte_map不为null,按照cte query level逐层将小于当前query level外层的cte list插入m_query_level_to_cte_map,保证当前层的query只能看到外层定义的cte
  4. CheckUnsupportedNodeTypes(query) 检查查询树中是否有不支持的结点类型 CheckSirvFuncsWithoutFromClause(query) check if the query has SIRV functions in the targetlist without a FROM clause
  5. first normalize the query m_query = CQueryMutators::NormalizeQuery(m_mp, m_md_accessor, query, query_level)
  6. 如果m_query->cteList不为空 ConstructCTEProducerList(m_query->cteList, query_level)
  7. m_scalar_translator = GPOS_NEW(m_mp)CTranslatorScalarToDXL(m_context, m_md_accessor, m_query_level, m_query_level_to_cte_map, m_dxl_cte_producers)

TranslateQueryToDXL main driver函数,以TranslateSelectQueryToDXL函数为例描述其流程
在这里插入图片描述

TranslateSelectQueryToDXL函数Translates a Query into a DXL tree. The function allocates memory in the translator memory pool, and caller is responsible for freeing it.

  1. CTranslatorUtils::CheckRTEPremissions(m_query->rtable)
  2. construct CTEAnchor operators for the CTEs defined at the top level CDXLNode *dxl_cte_anchor_top = NULL; CDXLNode *dxl_cte_anchor_bottom = NULL; ConstructCTEAnchors(m_dxl_cte_producers, &dxl_cte_anchor_top, &dxl_cte_anchor_bottom);
  3. 如果m_query->setOperations不为null,说明是union等操作
    child_dxlnode = TranslateSetOpToDXL(m_query->setOperations, m_query->targetList, output_attno_to_colid_mapping)
    CDXLLogicalSetOp *dxlop = CDXLLogicalSetOp::Cast(child_dxlnode->GetOperator());
    const CDXLColDescrArray *dxl_col_descr_array = dxlop->GetDXLColumnDescrArray();
    ForEach(lc, target_list) {
    TargetEntry *target_entry = (TargetEntry *) lfirst(lc);
    if (0 < target_entry->ressortgroupref) {
    ULONG colid = ((*dxl_col_descr_array)[resno - 1])->Id();
    AddSortingGroupingColumn( target_entry, sort_group_attno_to_colid_mapping, colid);
    }
    resno++;
    }
    如果m_query->windowClause不为null
    CDXLNode *dxlnode = TranslateFromExprToDXL(m_query->jointree)
    child_dxlnode = TranslateWindowToDXL(dxlnode, m_query->targetList, m_query->windowClause, m_query->sortClause, sort_group_attno_to_colid_mapping, output_attno_to_colid_mapping)
    其他情况 child_dxlnode = TranslateGroupingSets(m_query->jointree, m_query->targetList, m_query->groupClause,m_query->hasAggs, sort_group_attno_to_colid_mapping,output_attno_to_colid_mapping);
  4. translate limit clause CDXLNode *limit_dxlnode = TranslateLimitToDXLGroupBy(m_query->sortClause, m_query->limitCount, m_query->limitOffset, child_dxlnode, sort_group_attno_to_colid_mapping);
  5. 如果m_query->target不为NULL,需要为m_dxl_query_output_cols调用CreateDXLOutputCols(m_query->targetList, output_attno_to_colid_mapping)创建
  6. result_dxlnode = limit_dxlnode
  7. 如果dxl_cte_anchor_top不为NULL,需要加入CTE anchors. dxl_cte_anchor_bottom->AddChild(result_dxlnode); result_dxlnode = dxl_cte_anchor_top;

CDXLLogical

CDXLNode类所拥有的重要成员有4个(目前仅介绍两个),m_dxl_op是CDXLOperator类型的变量,在QueryToDXL流程中,其代表的是CDXLOperator的子类CDXLLogical和CDXLScalar;m_dxl_array是CDXLOperator类型Array,用于存放所属该节点的子节点,也是CDXLOperator类型的变量(CDXLLogical和CDXLScalar)。ORCA中目前支持的CDXLLogical子类如下所示。
在这里插入图片描述
以TranslateRTEToDXLLogicalGet【Returns a CDXLNode representing a from relation range table entry】为例,说明一下Query树子节点转换为DXL节点的流程。首先介绍一下RangeTblEntry节点:A range table entry may represent a plain relation, a sub-select in FROM, or the result of a JOIN clause. (Only explicit JOIN syntax produces an RTE, not the implicit join resulting from multiple FROM items. This is because we only need the RTE to deal with SQL features like outer joins and join-output-column aliasing.) Other special RTE types also exist, as indicated by RTEKind 【 RTE_RELATION(ordinary relation reference), RTE_SUBQUERY(subquery in FROM), RTE_JOIN(join), RTE_FUNCTION(function in FROM), RTE_VALUES(VALUES (<exprlist>), (<exprlist>), ...), RTE_VOID(CDB: deleted RTE), RTE_CTE(common table expr (WITH list element)), RTE_TABLEFUNCTION(CDB: Functions over multiset input )】。TranslateRTEToDXLLogicalGet函数只关注于处理RTE_RELATION(ordinary relation reference)类型的RangeTblEntry节点。

  1. 首先为range table entry的节点构造table descriptor
  2. 通过元数据访问接口为table descriptor获取IMDRelation元数据对象md_rel
  3. 通过md_rel元数据对象的存储类型,创建不同的CDXLLogical:为外部表创建CDXLLogicalExternalGet,其他表创建CDXLLogicalGet
  4. 创建CDXLNode结构体,并将第3步创建的dxl_op对象赋值给m_dxl_op成员
  5. 向CTranslatorQueryToDXL.m_var_to_colid_map中记录该表的列信息
  6. make note of the operator classes used in the distribution key
CDXLNode *CTranslatorQueryToDXL::TranslateRTEToDXLLogicalGet(const RangeTblEntry *rte, ULONG rt_index, ULONG  //current_query_level) {
	if (false == rte->inh){
		GPOS_ASSERT(RTE_RELATION == rte->rtekind);
		// RangeTblEntry::inh is set to false iff there is ONLY in the FROM clause. c.f. transformTableEntry, called from transformFromClauseItem
		GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature,GPOS_WSZ_LIT("ONLY in the FROM clause"));
	}

	// construct table descriptor for the scan node from the range table entry
	CDXLTableDescr *dxl_table_descr = CTranslatorUtils::GetTableDescr(m_mp, m_md_accessor, m_context->m_colid_counter, rte, &m_context->m_has_distributed_tables);

	CDXLLogicalGet *dxl_op = NULL;
	const IMDRelation *md_rel = m_md_accessor->RetrieveRel(dxl_table_descr->MDId());
	if (IMDRelation::ErelstorageExternal == md_rel->RetrieveRelStorageType()){
		dxl_op = GPOS_NEW(m_mp) CDXLLogicalExternalGet(m_mp, dxl_table_descr);
	}else{
		dxl_op = GPOS_NEW(m_mp) CDXLLogicalGet(m_mp, dxl_table_descr);
	}

	CDXLNode *dxl_node = GPOS_NEW(m_mp) CDXLNode(m_mp, dxl_op);

	// make note of new columns from base relation
	m_var_to_colid_map->LoadTblColumns(m_query_level, rt_index, dxl_table_descr);

	// make note of the operator classes used in the distribution key
	NoteDistributionPolicyOpclasses(rte);

	return dxl_node;
}

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

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

相关文章

C++代码格式化工具clang-format详细介绍

文章目录 clang-format思考代码风格指南生成您的配置运行 clang-format禁用一段代码的格式设置clang-format的设置预览 clang-format 我曾在许多编程团队工作过&#xff0c;这些团队名义上都有“编程风格指南”。该指南经常被写下来并放置在开发人员很少查看的地方。几乎在每种…

ios 查看模拟器沙盒的路径

打一个断点运行程序&#xff0c;在xcode consol底部控制台输入&#xff1a; po NSHomeDirectory() 复制路径粘帖到前往文件夹打开沙盒缓存文件夹

Dig the way

前言 什么时候才能乱杀比赛的题啊,给了两个文件第一个是师傅使用ida反编译的数据库文件&#xff0c;有提示但不多&#xff0c;主要还是看程序吧 分析 程序从文件读取输入值&#xff0c;虽然结果和输入无关但是要用到输入时产生的一些触发条件&#xff0c;所以动态强行输出fl…

AI帮你制作海报

介绍 Microsoft Designer是由微软推出的图像处理软件&#xff0c;能够通过套用模板等方式快速完成设计加工&#xff0c;生成能够在社交媒体使用的图片。Designer的使用更为简单便捷&#xff0c;用户能够通过套用模板等方式快速完成设计加工&#xff0c;生成能够在社交媒体使用…

LLaMA模型论文《LLaMA: Open and Efficient Foundation Language Models》阅读笔记

文章目录 1. 简介2.方法2.1 预训练数据2.2 网络架构2.3 优化器2.4 高效的实现 3.论文其余部分4. 参考资料 1. 简介 LLaMA是meta在2023年2月开源的大模型&#xff0c;在这之后&#xff0c;很多开源模型都是基于LLaMA的&#xff0c;比如斯坦福大学的羊驼模型。 LLaMA的重点是比…

Vue如何实现编程式导航声明方法,前进和后退导航

编程式导航声明方法&#xff0c;前进和后退导航 在router中设置路由导航跳转函数 只要发生跳转 导航的声明函数 访问控制系统如何形成 就这三种 导航守卫的案例&#xff0c;写一个Main.Vue 和login .Vue 后台主页 如果想要展示后台主页&#xff0c;就用这种方法 想实现路由跳转…

linux查看服务器系统版本命令

有时我们需要在linux服务器上安装DB、Middleware等&#xff0c;为了保证兼容性&#xff0c;我们需要知晓被提供的linux服务器版本是否满足需求&#xff0c;下面就说一说linux查看服务器系统版本命令。 1.cat /etc/redhat-release 适用于&#xff1a;rhel/centos等 2.cat /etc…

基于minio的dababend部署总结

Databend 是一款开源、弹性、低成本&#xff0c;基于对象存储也可以做实时分析的新式数仓。期待您的关注&#xff0c;一起探索云原生数仓解决方案&#xff0c;打造新一代开源 Data Cloud。 Minio搭建 minio 192.168.10.159 cd /data mkdir minio cd minio wget https://dl…

vue3+vite——打测试包+正式包+本地预览打包后的文件——基础积累

最近在学习vue3vite的内容&#xff0c;发现vite和webpack类似&#xff0c;下面将区别及使用方法做一下记录&#xff1a; 1.vite添加环境配置文件 ... ├── src ... ├── .env # 通用环境变量配置 ├── .env.development …

基于Open3D的点云处理0-测试所用数据下载

地址&#xff1a;github 20220201-data 20220301-data

C. Binary String Copying - 思维

分析&#xff1a; 赛时我是直接模拟的&#xff0c;tle然后mle&#xff0c;补提&#xff0c;发现规律&#xff0c;每一个改变的字符串都只会对应一个需要改变的区间&#xff0c;例如第一个样例前两个101100 -> 011100和101100 -> 011100&#xff0c;对应区间在确定改变的范…

[个人笔记] Windows配置NTP时间同步

Windows - 运维篇 第六章 Windows配置NTP时间同步 Windows - 运维篇系列文章回顾Windows配置NTP时间同步域控环境的NTP配置工作组环境的NTP配置Windows的CMD部分命令集 参考来源 系列文章回顾 第一章 迁移WinSrv系统到虚拟机 第二章 本地安全策略xcopy实现实时备份文件夹内容 …

【Docker 学习笔记】Windows Docker Desktop 安装

文章目录 一、前言二、Windows Docker 安装1. 基于Hyper-V后端和Windows容器的安装2. 基于WSL2后端的安装&#xff08;推荐&#xff09;3. 安装Docker Desktop on Windows4. 启动并验证Docker Desktop 一、前言 Docker并非是一个通用的容器工具&#xff0c;它依赖于已存在并运…

Linux C语言实践eBPF

手动编译了解过程 通过对关键步骤make Msamples/bpf的实践&#xff0c;我们已经可以编译出内核源码中提供的ebpf样例。但这还不够我们充分地理解这个编译过程&#xff0c;我们将这编译过程拆解一下&#xff0c;拆解成可以一步步执行的那种&#xff0c;首先是环境准备&#xff…

算法通关村第二关——两两交换链表中的节点的问题解析

题目类型 链表反转 题目描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点&#xff0c;且必须在不修改节点内部的值的情况下完成本题&#xff0c;即&#xff1a;只能进行节点交换 效果图 题目分析 如果原始顺序是 dummy(虚拟头节点) …

JavaSE复盘2

Collection接口的接口对象集合&#xff08;单列集合&#xff09; List接口&#xff1a;元素按照先后有序保存&#xff0c;可重复 LinkList接口实现类&#xff0c;链表&#xff0c;随机访问&#xff0c;没有同步&#xff0c;线程不安全ArrayList接口实现类&#xff0c;数组&…

❤️创意网页:打造炫酷网页 - 旋转彩虹背景中的星星动画

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

iOS - 检测项目中无用类和无用图片

一、无引用图片检测 LSUnusedResources 安装插件 LSUnusedResources &#xff0c;用【My Mac】模拟器运行,如下图&#xff1a; Project Path 就是项目所在的路径&#xff0c;然后点击右下角 Search按钮&#xff0c;就可以看到被搜索出来的图片资源。 注意&#xff1a;这里被搜…

【TypeScript】类型声明及应用(二)

【TypeScript】类型声明及应用&#xff08;二&#xff09; 一、前言 TypeScript开发中需要对定义的变量指定类型&#xff0c;目前版本都支持哪些类型&#xff0c;每一个类型都有哪些含义&#xff0c;在这篇文章中&#xff0c;我们将会对其进行总结说明 二、JavaScript基本数据…

预约上门系统源码开发,改变服务行业的未来

预约上门系统源码开发是一项复杂而有挑战性的任务&#xff0c;但也是实现智能化预约服务的关键一步。通过自主开发预约上门系统的源码&#xff0c;企业可以完全定制系统的功能、界面和安全性&#xff0c;从而为用户提供更高效、便捷、个性化的预约体验。本文将带你深入了解预约…