技术贴 | Query 物理计划构建指南

news/2024/7/22 1:33:52/文章来源:https://blog.csdn.net/ZNBase/article/details/139247595

在往期博客《执行器 - Query 执行详解》中,我们介绍到到一条 Query 的 SQL 语句需要经过:词法分析 —— 生成 AST 语法树 —— 生成物理计划。本期博客我们接续上篇讲解一条 Query 语句物理计划的具体结构,以及如何构建物理计划。

物理计划是根据逻辑计划(逻辑计划讲解参考往期博客)生成的树形结构,执行引擎需要按照物理计划进行实际查询,根据逻辑计划的不同逻辑算子生成物理算子,通过记录处理链路,即数据流来记录算子的执行顺序,根据顺序进行执行。

01 物理计划结构

物理计划组成

▪ Processors
该成员记录了整个物理计划的算子。

▪ Streams
数据流,记录了所有算子之间的连接关系,Streams 和 Processors 基本上就可以较为完整地描述整个物理计划的拓扑结构。

▪ ResultRouters
物理计划按层次进行构建(由逻辑计划树自底向上进行构建),该成员记录了当前层次构建完成后的所有算子,它们是由同一种逻辑算子转换而成的多个物理算子。

▪ ResultTypes
当前层次构建完成后的所有算子的输出列类型数组。

▪ ResultColumns
当前层次构建完成后的所有算子的输出列数量。

▪ GatewayNodeID
物理计划执行的网关节点,数据最终的汇总节点。

▪ MergeOrdering
当前层次构建完成后,下一层需要按哪几列进行归并输入。

算子组成

▪ Node
算子执行所在节点。

▪ Spec
算子的规格信息。

算子规格组成

▪ Input
该算子的逻辑输入数目。

▪ Core
算子的内部执行逻辑。

▪ Post
记录数据经过该算子后的一些投影、选择、Limit 和 Offset 等处理。

▪ Output
算子的逻辑输出。

数据流组成

▪ SourceProcessor
标明连接的源算子。

▪ DestProcessor
标明连接的目标算子。

DestInput
标明连接目标算子的哪个逻辑输入。

02 物理计划构建

以三节点集群执行一条查询语句为样例解析物理计划构建和执行流程,结构如下:

SQL
create table a(a1 int, a2 int, a3 bool);
insert into a values(1,1,false),(2,2,false),(3,3,false);

create table b(b1 int, b2 int, b3 bool);
insert into b values(1,2,false),(3,4,true),(5,6,true);

select * from a join b on a.a1=b.b1;
向右滑动查看
请添加图片描述
整体流程示意图

算子组成

▪ Node
算子执行所在节点。

根据逻辑算子生成物理算子

该物理计划构建首先会进入 Join 算子的物理算子生成函数 (createPlanNodeforJoin),进行左右两个 scanNode 的物理计划构建,scanNode 是处理表键/值对的扫描,并重组为行的算子。

在构建 scanNode 时,会构建表读取算子TableReader (createTableReaders),它会确认表数据的分布信息,根据数据分布所在节点创建出对应数量的 TableReader 算子,最终左右的物理计划将各生成的 3个 TableReader 算子加入到 PhysicalPlan 当中,如图所示。请添加图片描述

算子组成合并左右子计划

MergePlans 将左右计划进行合并,整体变成一个物理计划,该物理计划中有 6 个 TableReader 算子。
请添加图片描述

根据节点数构建 Join 算子

findJoinProcessorNodes 函数决定在几个节点做 Join 操作,这里的 Tablereader 算子是 3 节点,所以 Join 算子也会构建 3 个分别对应 3 个节点,之后在每个指定节点上添加 HashJoiner,并将左边和右边的输出进行连接,生成 3 个 HashJoiner 算子,并将它左右算子的 Output 类型改为 OutputRouterSpec_BY_HASH(执行时需要跨节点 Hash 重分布,下一小节会介绍另一种 Hash 分布方式)类型。
请添加图片描述

构建数据流
每个 HashJoiner 算子都需要有左右两个 Input,在每个节点上执行时都需要获取到两个表的 TableReader 算子的输出,所以需要调用 MergeResultStreams 方法按照节点数量将 a 表和 b 表的各 3 个 TableReader 连接到各个 HashJoiner 的 Input 左右两端。

如图所示,跨节点 Hash 数据重分布方式 (OutputRouterSpec_BY_HASH) 是要将三个节点上每个 HashJoiner 算子的 Input 每个表的数据做到基本平均分配,例:a表在节点 1 有 3000 条数据,节点 2 有 5000 条数据,节点 3 有 1000条 数据,节点 2需要将数据传输一部分到节点 1 和节点 3,最终三个节点的 HashJoiner 算子的 a 表 Input 都有 3000 条数据。

有向箭头表示数据流 (Stream),Stream 起于一个算子的 Output,终于另一个算子的Input,图中的 Output 类型均为上一小节所说的 OutputRouterSpec_BY_HASH。
请添加图片描述
另外,除本样例中提到跨节点 Hash 重分布 (OutputRouterSpec_BY_HASH) 分布方式,还有一种镜像 Hash 分布方式 (OutputRouterSpec_MIRROR),此方式会将表数据完全广播到每一个节点上,不需要根据节点数进行数据重分布,此 Hash 分布方式的计划如图所示,具体采用哪种分布方式,需要根据表数据量,节点数等进行数据传播和接受的代价计算,两种方式哪个代价更小就使用哪种分布方式。
请添加图片描述

物理计划增加汇总算子
createPlanForNode 函数完成后,物理计划的基本结构就生成完毕,但还需要一个最终汇总结果返回的算子,FinalizePlan 函数便会在已有的物理计划基础上增加一个 Noop 算子,用于汇总最终的执行结果,还需要设置每个算子的 Input 和 Output 所关联的 StreamID,以及 Stream 的类型(Stream 如果连接相同节点的算子为 streamEndpointSpec_LOCAL,否则为 streamEndpointSpec_REMOTE)为之后物理计划的执行做准备,此阶段物理计划如图所示。
请添加图片描述至此,物理计划构建全部完成,而后将进行物理计划的分布式执行,此模块将在后续博客进行介绍。

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

如若内容造成侵权/违法违规/事实不符,请联系编程新知网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenLayers6入门,OpenLayers实现在地图上拖拽编辑修改绘制图形

专栏目录: OpenLayers6入门教程汇总目录 前言 在前面一章中,我们已经学会了如何绘制基础的三种图形线段、圆形和多边形:《OpenLayers6入门,OpenLayers图形绘制功能,OpenLayers实现在地图上绘制线段、圆形和多边形》,那么本章将在此基础上实现图形的拖拽编辑功能,方便我…

【CSharp】将ushort数组保存为1通道位深16bit的Tiff图片

【CSharp】将ushort数组保存为1通道位深16bit的Tiff图片 1.背景2.接口 1.背景 System.Drawing.Common 是一个用于图像处理和图形操作的库,它是 System.Drawing 命名空间的一部分。由于 .NET Core 和 .NET 5 的跨平台特性,许多以前内置于 .NET Framework…

linux centos磁盘清理相关

清理磁盘流程 1、查看磁盘挂载路径及使用率 df -h2、查看当前文件下文件大小 du -sh *3、制空文件内容 > 文件名 ###制空当前文件内容,直接清0 列子 >access.loglinux操作系统中,经常会遇到磁盘空间满的问题。遇到这样的问题,先查下…

抖音小店怎么做才会赚钱?不要再想赔钱起店了,根本不稳定!

大家好,我是电商糖果 抖音小店发展有四五年的时间了,现在网上有很多分享做店方法的博主。 可以说百分之八十左右的博主喜欢分享货损起店,暴力起店的玩法。 难道这种赔钱起店的玩法真的赚钱吗? 很多新手商家开过之后就会发现&a…

图片如何去水印?ps去除图片上的水印应该怎么操作?教会你!

图片去水印是一个常见的需求,尤其在使用他人图片时,为避免版权问题,去除水印是很有必要的。Photoshop(PS)作为一款专业的图片处理软件,提供了多种去除水印的方法。以下是使用PS去除图片水印的几种详细步骤&…

最后7天,高考翻盘秘籍等你开启!

高考,这场关乎未来的考试,对于每一个学生来说都是一次严峻的挑战。随着倒计时的进行,无数考生和家长的焦虑和期待达到了顶点。在这个最后7天的关键时期,我们为即将参加高考的学生及其家长提供一份复习秘籍,帮助你们抓住…

HNCTF

HNCTF 文章目录 HNCTFBabyPQEZmathez_Classicf(?*?)MatrixRSABabyAESIs this Iso? BabyPQ nc签到题,跟端口连接拿到n和phin n 8336450100232098099043686671148282601664696810002345240872579498695511770993195704402414029892029461830476866385453475141207…

视频监控平台AS-V1000产品介绍:账户或用户数据的导入和导出功能介绍

目录 一、功能描述 (一)导入功能定义 (二)导出功能定义 二、用户数据的导入导出的作用 三、AS-V1000新版本的导出和导入功能介绍 (一)功能主界面 (二)导出功能 1、导出操作 …

KVM+GFS分布式存储系统构建KVM高可用

KVMGFS分布式存储系统构建KVM高可用 文章目录 KVMGFS分布式存储系统构建KVM高可用资源列表基础环境一、安装部署KVM1.1、安装KVM1.2、验证1.3、开启libvirtd服务1.4、配置KVM桥接网络 二、部署GlusterFS2.1、安装GlusterFS软件2.2、所有node节点启动GFS2.3、创建GFS群集2.4、查…

WorkPlus移动应用平台集成单点登录,实现统一门户解决方案

随着企业数字化转型的深入,移动办公已经成为企业提高工作效率和员工协作的重要途径。为了更好地管理企业移动应用,提升员工体验,简化登录流程,许多企业开始采用集成单点登录技术的企业移动应用平台,实现统一门户的目标…

Vulhub——adminer

文章目录 一、CVE-2021-21311(SSRF)二、CVE-2021-43008(远程文件读取) 一、CVE-2021-21311(SSRF) Adminer是一个PHP编写的开源数据库管理工具,支持MySQL、MariaDB、PostgreSQL、SQLite、MS SQL…

闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?

前言 虽然说,目前 .NET FrameWork 上的大部分类都已经移植到 .NET Core 上,而且 .NET FrameWork 也已经停止了更新,未来必然是 .NET Core 的天下,但要说现在 .NET Core 就能淘汰 .NET FrameWork,我觉得为时尚早&#…

SpringBoot使用rsa-encrypt-body-spring-boot实现接口加解密

废话不多说&#xff0c;直接上代码 引入依赖 <dependency><groupId>cn.shuibo</groupId><artifactId>rsa-encrypt-body-spring-boot</artifactId><version>1.0.1.RELEASE</version> </dependency>配置文件 rsa:encrypt:# 是…

大模型效能工具之智能CommitMessage

01 背景 随着大型语言模型的迅猛增长&#xff0c;各种模型在各个领域的应用如雨后春笋般迅速涌现。在研发全流程的效能方面&#xff0c;也出现了一系列贯穿全流程的提效和质量工具&#xff0c;比如针对成本较高的Oncall&#xff0c;首先出现了高质量的RAG助手&#xff1b;在开…

学习javascript的函数

1.什么是函数&#xff1f; 可以重复被使用的代码块 作用&#xff1a;函数可以把具有相同或者相似逻辑的代码“包裹起来”&#xff0c;有利于代码的复用。 2.函数的基本使用 1.定义函数 利用关键字Function 定义函数&#xff08;声明函数&#xff09; function 函数名(){函…

掌握常用的域信息收集的方法和域控制器攻击的方法(渗透课程)

域信息收集 【实验目的】 通过利用PsExec命令远程连接内网主机&#xff0c;分别收集查询域用户信息和域控制器相关信息&#xff0c;了解并掌握如何收集域内的信息命令。 【知识点】 域信息收集 【实验原理】 NET命令是功能强大的以命令行方式执行的工具。它包含了管理网络…

现代 c++ 三:移动语义与右值引用

移动语义很简单&#xff0c;但它相关联的术语很复杂。本文尝试从历史的角度解释清楚这些乱七八糟的术语及其关联&#xff1a; 表达式 (expression)、类型&#xff08;type&#xff09;、值类别 (value categories)&#xff1b; 左值 (lvalue)、右值 (rvalue)、广义左值 (glval…

QT 使用QLsitView 实现多个子项选中取消效果

文章目录 效果图概述部分代码总结 效果图 概述 整个界面的布局介绍请看这篇博客想要的到这种自由选择中的Item效果&#xff0c;需要使用到Model-view的思想&#xff0c;每个item中都要存放一个标志位&#xff0c;用在Paint函数去判断是否绘制为按下的状态。每次item被点击时&a…

vscode远程操作虚拟机Ubuntus上的某个目录

每次打开vscode时候&#xff0c;默认就开始链接最近一次登录的目录&#xff0c;让你输入登录密码&#xff0c;如果此时不想远程登录&#xff0c;那么&#xff0c;可以按esc退出登录连接&#xff0c;这样就会弹出关闭远程登录窗口&#xff0c;点击关闭即可 FR&#xff1a;徐海涛…

VM中Ubuntu16.04的下载以及ROS—kinetic的版本下载

一、Ubuntu镜像地址 转载备份一下&#xff1b; 官方下载地址&#xff08;不推荐&#xff09; https://www.ubuntu.com/downloadhttps://www.ubuntu.com/download 中科大源 Index of /ubuntu-releases/16.04/http://mirrors.ustc.edu.cn/ubuntu-releases/16.04/ 阿里云开…