ORCA优化器浅析——GP数据库调用优化器流程

news2025/1/17 0:22:02

首先我们需要看CGPOptimizer类(src/include/gpopt/CGPOptimizer.h)为Greenplum数据库提供ORCA优化器export出来的函数的封装。Greenplum数据库主流程调用extern "C"中提供的函数,比如初始化ORCA优化器的函数InitGPOPT,优化查询树的函数GPOPTOptimizedPlan,explain流程中调用的SerializeDXLPlan函数。

class CGPOptimizer{
public:	
	static PlannedStmt *GPOPTOptimizedPlan( Query *query, bool * had_unexpected_failure	// output : set to true if optimizer unexpectedly failed to produce plan ); // optimize given query using GP optimizer
	static char *SerializeDXLPlan(Query *query); // serialize planned statement into DXL
	static void InitGPOPT(); // gpopt initialize and terminate
	static void TerminateGPOPT();
};

extern "C" {
extern PlannedStmt *GPOPTOptimizedPlan(Query *query, bool *had_unexpected_failure);
extern char *SerializeDXLPlan(Query *query);
extern void InitGPOPT();
extern void TerminateGPOPT();
}

CGPOptimizer为GP提供ORCA优化器初始化函数

InitGPOPT函数用于Initialize GPTOPT and dependent libraries,最终调用的是gpos_init(&params)gpdxl_init()gpopt_init()CMemoryPoolPallocManager::Init()该函数由src/backend/utils/init/postinit.c/InitPostgre函数调用

extern "C" {
void InitGPOPT() {
	GPOS_TRY {
		return CGPOptimizer::InitGPOPT();
	}GPOS_CATCH_EX(ex){
		if (GPOS_MATCH_EX(ex, gpdxl::ExmaGPDB, gpdxl::ExmiGPDBError)){
			PG_RE_THROW();
		}
	}
	GPOS_CATCH_END;
}
}
void CGPOptimizer::InitGPOPT() {
	if (optimizer_use_gpdb_allocators){ CMemoryPoolPallocManager::Init(); }
	struct gpos_init_params params = {gpdb::IsAbortRequested};
	gpos_init(&params); gpdxl_init(); gpopt_init();
}

在这里插入图片描述

CGPOptimizer为GP提供ORCA优化器优化函数

请添加图片描述
GP有两种优化器:PG优化器和ORCA优化器。如何确定执行计划来自PG优化器还是ORCA优化器,通过查看PlanGenerator值typedef enum PlanGenerator {PLANGEN_PLANNER, /* plan produced by the planner*/ PLANGEN_OPTIMIZER, /* plan produced by the optimizer*/ } PlanGenerator;
在这里插入图片描述
Master端简查询入口函数exec_simple_query开始生成执行计划并进行分发,如下图所示。在standard_planner函数中分为orca优化器和PG优化器2个分支产生执行计划。产生执行计划后,由函数PortalStart函数开始调用standard_ExecutorStart从而执行分发执行计划函数CdbDispathPlan将执行计划从master分发到各个segment。摘自https://blog.51cto.com/yanzongshuai/5675056
在这里插入图片描述

extern "C" {
PlannedStmt *GPOPTOptimizedPlan(Query *query, bool *had_unexpected_failure){ return CGPOptimizer::GPOPTOptimizedPlan(query, had_unexpected_failure); }
}
//---------------------------------------------------------------------------
//	@function:		CGPOptimizer::PlstmtOptimize
//	@doc:		Optimize given query using GP optimizer
//---------------------------------------------------------------------------
PlannedStmt *CGPOptimizer::GPOPTOptimizedPlan(Query *query, bool *had_unexpected_failure	// output : set to true if optimizer unexpectedly failed to produce plan){
	SOptContext gpopt_context;	PlannedStmt *plStmt = NULL;	*had_unexpected_failure = false;
	GPOS_TRY{
		plStmt = COptTasks::GPOPTOptimizedPlan(query, &gpopt_context);		
		gpopt_context.Free(gpopt_context.epinQuery, gpopt_context.epinPlStmt); // clean up context
	}GPOS_CATCH_EX(ex){
        ...
	}GPOS_CATCH_END;
	return plStmt;
}
//---------------------------------------------------------------------------
//	@function:		COptTasks::GPOPTOptimizedPlan
//	@doc:		optimizes a query to plannedstmt
//---------------------------------------------------------------------------
PlannedStmt *COptTasks::GPOPTOptimizedPlan(Query *query, SOptContext *gpopt_context){
	gpopt_context->m_query = query;gpopt_context->m_should_generate_plan_stmt = true;
	Execute(&OptimizeTask, gpopt_context);
	return gpopt_context->m_plan_stmt;
}

CGPOptimizer为GP提供ORCA优化器explain函数

SerializeDXLPlan函数用于Serialize planned statement into DXL将planned statement序列化为DXL,其最终调用COptTasks::Optimize(query)函数。

extern "C" {
char *SerializeDXLPlan(Query *query){ return CGPOptimizer::SerializeDXLPlan(query); }
}
char *CGPOptimizer::SerializeDXLPlan(Query *query){
	GPOS_TRY;{ return COptTasks::Optimize(query); }
	GPOS_CATCH_EX(ex);{
		errstart(ERROR, ex.Filename(), ex.Line(), NULL, TEXTDOMAIN);
		errfinish(errcode(ERRCODE_INTERNAL_ERROR),errmsg("optimizer failed to produce plan"));
	}
	GPOS_CATCH_END;
	return NULL;
}
//---------------------------------------------------------------------------
//	@function:		COptTasks::Optimize
//	@doc:		optimizes a query to physical DXL
//---------------------------------------------------------------------------
char *COptTasks::Optimize(Query *query){
	SOptContext gpopt_context;
	gpopt_context.m_query = query;
	gpopt_context.m_should_serialize_plan_dxl = true;
	Execute(&OptimizeTask, &gpopt_context);	
	gpopt_context.Free(gpopt_context.epinQuery, gpopt_context.epinPlanDXL); // clean up context
	return gpopt_context.m_plan_dxl;
}

COptTasks::GPOPTOptimizedPlanh和COptTasks::Optimize函数都是调用OptimizeTask函数,不同的是设置SOptContext的m_should_generate_plan_stmt或m_should_serialize_plan_dxl,达到不同的作用:optimizes a query to plannedstmt、optimizes a query to physical DXL。
SerializeDXLPlan函数用于explain流程:ExplainQuery/ExplainOneUtility --> ExplainOneQuery --> ExplainDXL --> SerializeDXLPlan。
在这里插入图片描述

CGPOptimizer为GP提供ORCA优化器结束函数

TerminateGPOPT函数用于Terminate GPOPT and dependent libraries,主要调用gpopt_terminate()、gpdxl_terminate()、gpos_terminate()。

extern "C" {
void TerminateGPOPT() {
	GPOS_TRY { return CGPOptimizer::TerminateGPOPT();
	} GPOS_CATCH_EX(ex){
		if (GPOS_MATCH_EX(ex, gpdxl::ExmaGPDB, gpdxl::ExmiGPDBError)) {
			PG_RE_THROW();
		}
	}
	GPOS_CATCH_END;
}
}
void CGPOptimizer::TerminateGPOPT() {
	gpopt_terminate();
	gpdxl_terminate();
	gpos_terminate();
}

ShutdownPostgres函数调用TerminateGPOPT,并销毁OptimizerMemoryContext内存上下文。
在这里插入图片描述

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

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

相关文章

springboot+jsp农产品商城宣传网站设计与实现oo6e3

在该在线助农系统设计与实现中,idea能给用户提供更多的方便,其特点一是方便学习,方便快捷;二是有非常大的信息储存量,主要功能是用在对数据库中查询和编程。其功能有比较灵活的数据应用,只需利用小部分代码…

【Leetcode60天带刷】day30回溯算法——332.重新安排行程 , 51. N皇后 ,37. 解数独

​ 题目: 332. 重新安排行程 给你一份航线列表 tickets ,其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,…

【从零开始学习JAVA | 第十四篇】继承

目录 前言: 引入: 继承: 小拓展: 优点: 成员方法的继承问题: 总结: 前言: 继承是面向对象三大特性之一,它是在封装之后我们讲解的一个重要的性质,继承…

在github上创建个人主页的方法【2023更新版】

01-进入github的网站,链接 https://github.com/ ,然后注册,登陆,注意登陆时设置的用户名(username)就是将来你个人主页的三级域名,所以这里一定要慎重填写username。如下图所示: 02-注册完成后进入个人主…

2024考研408-计算机组成原理第四章-指令系统

文章目录 前言一、指令系统现代计算机的结构1.1、指令格式1.1.1、指令的定义1.1.2、指令格式1.1.3、指令—按照地址码数量分类①零地址指令②一地址指令(1个操作数、2个操作数情况)③二地址指令④三地址指令⑤四地址指令 1.1.4、指令-按照指令长度分类1.…

【计算机组成原理】Yy-z02模型机的硬布线控制器设计

目录 一、Yy-z02模型机的系统结构 二、Yy-z02模型机的数据通路 三、Yy-z02模型机的指令执行 四、Yy-z02模型机的硬布线控制器 一、Yy-z02模型机的系统结构 指令系统的实现 <--- 构造它的硬件系统 硬件系统构造过程&#xff1a; 分析指令格式和各指令的功能确定部件连…

金蝶软件遭遇.locked勒索病毒攻击:如何保护与解救您的数据?

引言&#xff1a; 近期&#xff0c;部分运行金蝶云星空软件的服务器遭受了一场勒索病毒的网络安全攻击&#xff0c;其重要数据遭到了.locked勒索病毒的加密。作为一个知名的企业级ERP软件及财务软件&#xff0c;金蝶软件的数据安全事关客户和企业的利益。91数据恢复在本文将深…

【王道·操作系统】第四章 文件管理【未完】

一、初识文件管理 文件&#xff1a;一组有意义的信息/数据集合文件属性&#xff1a; 文件名&#xff1a;创建文件的用户决定&#xff0c;主要是为了方便用户找到文件&#xff0c;同一目录下不允许有重名文件标识符&#xff1a;一个系统内的各文件标识符唯一&#xff0c;对用户来…

老大给了个新需求:如何将汉字转换成拼音字母?1行Python代码搞定!

大家好&#xff0c;这里是程序员晚枫&#xff0c;小红薯也叫这个名。 之前的视频给大家分享了&#xff1a;中文编程&#xff0c;一行代码实现。 今天给大家分享一下&#xff0c;如何通过1行Python代码&#xff0c;实现汉语转拼音 1、先上代码 实现汉语转拼音效果的第三方库…

逻辑回归(Logistics Regression)

1.逻辑回归&#xff08;Logistics Regression&#xff09; 逻辑回归用于解决二分类问题 1.1 Sigmoid函数 sigmoid函数在神经网络中如何起作用&#xff1f;详见本人笔记&#xff1a;机器学习和AI底层逻辑 复杂非线性分类->多个线段->每个线段是叠加而来的->sigmoid函…

计算机视觉 + Self-Supervised Learning 五种算法原理解析

计算机视觉领域下自监督学习方法原理 导语为什么在计算机视觉领域中进行自我监督学习&#xff1f; 自监督学习方法Generative methodsBEiT 架构 Predictive methodsContrastive methodsBootstraping methodsSimply Extra Regularization methods 导语 自监督学习是一种机器学习…

Web服务器群集:Nginx网页及安全优化

目录 一、理论 1.Nginx网页优化 2.Nginx安全优化 3.Nginx日志分割 二、实验 1.网页压缩 2.网页缓存 3.连接超时设置 4.并发设置 5.隐藏版本信息 6.脚本实现每月1号进行日志分割 7.防盗链 三、总结 一、理论 1.Nginx网页优化 &#xff08;1&#xff09;概述 在企…

神仙打架的618,谁才是真正的大赢家?

618大促已经缓缓落下帷幕&#xff0c;各大平台和品牌方准时准点晒出成绩单。在一串又一串红彤彤的战报中&#xff0c;家电品牌你追我赶的激烈战况一如以往。 我们从中也得以窥见新消费时代下中国家电行业的未来&#xff0c;尤其是在消费者纷纷捂紧钱袋子的今年&#xff0c;红色…

快解析域名映射,通过外网域名来访问内网

在本地搭建主机应用后&#xff0c;由于没有公网IP或没有公网路由权限&#xff0c;在需要发布互联网时&#xff0c;就需要用到外网访问内网的一些方案。由于内网IP在外网不能直接访问&#xff0c;通常就用通过外网域名来访问内网的方法。那么&#xff0c;公网域名如何解析到内网…

无法开启nginx -t等命令的解决办法

在 Windows 下载安装了 Nginx&#xff0c;配置了环境变量全局使用 Nginx。但是仍旧无法开启nginx -t等命令。 原因&#xff1a; Nginx 在使用时 conf-path 是根据相对路径来找的。 匹配的路径是 C:\Users\20210121/conf/nginx.conf &#xff0c;完全是错的。 解决办法&#x…

Redis进阶 - Redis持久化

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis进阶 - Redis持久化 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-advance-persistence.html 单点Redis的问题 数据丢失问题&#xff1a;Redis 是内存存储&#xff0c;服务重启可能会丢失数据。…

基于卷积神经网络的高光谱图像分类

文章目录 引言1. 基于光谱特征2. 基于空间特征3. 基于空谱特征3.1 空间特征和光谱特征的融合3.2 基于3D-CNN分类 4. 总结 引言 近年来深度学习的技术在计算机视觉领域中大放异彩&#xff0c;使得对多光谱数据分类的研究迅速发展&#xff0c;结合2D-CNN&#xff0c;3D-CNN&…

数据结构第六章 图 6.4 错题整理

4.A A. 不是简单路径的话&#xff0c;有环&#xff0c;去环路径会更短 B. 适合的 弗洛伊德算法才不适合 C. 本来就是 D 2X2矩阵拓展到3X3矩阵 再扩大 若是子集 即加入新顶点后&#xff0c;最短路径都没有变&#xff0c;错 5.B 本题用弗洛伊德更合适 但这道题只需全部代入求最…

xml系列篇之xml建模

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于xml的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 是什么 为什么要使用xml建模 怎么使用 1.…

NodeJS Mocha测试⑩④

文章目录 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持&#x1f618;前言Mocha 1、编写测试 2、SumJS代码 3、使用内置断言库 4、第三方库 chai断言库 5、第三方库 异步断言 6、http测试 7、钩子函数更多包工具总…