构建高效物理计划:从逻辑查询到算子实现

news2025/1/11 20:52:17

​一、前言

本文主要介绍内容一条查询语句如何实现由逻辑计划生成物理计划。查询语句要执行的操作、涉及的表信息等存放于逻辑计划的 PlanNode 中,物理计划的构建就是通过解析逻辑计划的 PlanNode,将对应的 PlanNode 转换为对应算子(Processor),算子之间再通过 Stream 连接。

在这里插入图片描述

为了方便大家理解本文的内容,先简单介绍下面三个概念:

  • Physical Plan:物理计划,将逻辑查询计划的每一个操作符选择实现算法并选择这些操作符的执行顺序得到的计划。
  • Processor:物理计划得到的结果,存放了语句所需要执行的算子的相关信息,需要执行什么算子,分布式中算子需要发送到哪个节点中执行等。
  • Stream:存放在 Processor 的信息,标注了 Processor 中的算子的执行顺序以及执行节点的信息。

二、物理计划的构建

我们将通过以下 SQL 语句来介绍物理计划的生成:

select max(height),class from heights join students on heights.id=students.id group by class having class in(1,2) order by max(height) desc limit 2;

该查询语句的 PlanNode 如下图所示:

在这里插入图片描述

以上述 PlanNode 为例,其最下层为两个 scanNode,分别是对 heights 和 students 的一个全表扫描,其结果会返回给上层的 joinNode,joinNode 会将两张表作 join 生成一张虚拟表,里面有两张表中的所有列。

其上层的 renderNode 会对这张虚拟表进行查询,筛选出 height 列和 class 列,groupNode 会对 class 列进行 group 处理,并对 class 作 max 聚合。然后, sortNode 对 groupNode 处理过的 max 聚合结果进行排序,limitNode 对结果作相应的操作。最后,最上层的 renderNode 对结果进行查询,筛选出 max(height) 列和 class 列。以上即为该 PlanNode 的详细信息。

接着会通过 createPlanForNode 函数对 PlanNode 进行解析生成物理计划。该函数是一个递归函数,会通过 PlanNode 的类型来构建相应的物理计划。

以上述查询语句为例,该 PlanNode 会层层递归先执行 scanNode 的构建函数 createTableReaders;接着,通过 initTableReaderSpec 新建 tablereader 的 spec;随后,通过逻辑计划传下来的 plannode 得到算子的 filter 和 limit;然后,通过 MakeExpression() 构造物理计划的 filter 并将 filter 和 limit 传入 post 中。

最后,通过 planCtx 的 isLocal 判断是否是分布式读取计划。

  • 若是,则构建 SpanPartition 数组,将到各个节点读取 table 的值;
  • 若不是,则单读取本地数据即可。

具体流程如下图所示
在这里插入图片描述

在构建完 left scanNode 和 right scanNode 的计划后得到 rightPlan 和 leftPlan, leftPlan 和 rightPlan 执行 MergePlans() 合并左右计划,将左右计划的 processor 和 stream 等信息合并。

之后判断是否为分布式执行的步骤与上面的判断方法类似。最后再判断 leftMergeOrd.Columns 是否等于 nil。

  • 若是,则构建 hashjoinspec;
  • 若不是,则构建 mergejoinspec。

执行 AddjoinStage() 将 joinProcessor 添加到指定的节点上去并将左右 output 连接到这些 Processor 中,joinNode 也就处理完毕了,基本流程如下图。依次处理 renderNode, groupNode, sortNode 等,将相应算子信息添加到物理计划中。
在这里插入图片描述

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

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

相关文章

springboot整合tio-websocket方案实现简易聊天

写在最前: 常用的http协议是无状态的,且不能主动响应到客户端。最初想实现状态动态跟踪只能用轮询或者其他效率低下的方式,所以引入了websocket协议,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务…

富士通“Actlyzer”提供基于AI的基于视频的行为分析

想象一下这样的场景:一个男人走近一个家的前门,蹲下并检查钥匙孔。这是丢失房屋钥匙的居民还是客人?还是寻找入口点的窃贼?“Actlyzer”是一种新的人工智能安全系统,旨在区分这种情况。富士通实验室和研发中心的行为分…

经典文献阅读之--Online Extrinsic Calibration(激光雷达,视觉和惯导外参在线标定)

0. 简介 为了实现精确定位,自动驾驶车辆通常依靠围绕移动平台的多传感器感知系统。校准是一个耗时的过程,机械畸变会导致外部校准误差。因此,《Lidar-Visual-Inertial Odometry with Online Extrinsic Calibration》提出了一种激光雷达-视觉…

安卓手机怎样录屏?手机录屏小技巧分享

如果你需要在安卓手机上录制一段视频或者教程,录屏功能是一个非常有用的工具。在这篇文章中,我们将会介绍安卓手机如何录屏,并分享一些小技巧。 在安卓手机上录屏的方法有很多种,这里我们介绍两种比较常用的方法。 方法一&#x…

Nodejs 爬虫 第二章(通过掘金 userId 抓取到所有文章)!HTML to Markdown

前言 就在昨天晚上,做了一个通过掘金文章链接进行解析html转化为markdown文档,并且把图片进行下载和替换,但是最后也留了个伏笔(我一定会回来的~)就是通过用户id,把所有的文章都转化出来&#x…

安卓嵌入h5页面方法笔记

<?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"><uses-featureandroid:name"android.hardware.t…

2023年的深度学习入门指南(24) - 处理音频的大模型 OpenAI Whisper

2023年的深度学习入门指南(24) - 处理音频的大模型 OpenAI Whisper 在这一讲之前&#xff0c;我们所用的大模型都是针对文本的。这一讲我们增加一个新的领域&#xff0c;即音频。我们将介绍OpenAI的Whisper模型&#xff0c;它是一个处理音频的大模型。 Whisper模型的用法 Wh…

万界星空/推出生产制造执行MES系统/开源MES/免费下载

免费MES系统介绍 什么是MES系统呢&#xff1f;MES系统主要功能就是解决“如何生产”的问题。通过实施MES系统&#xff0c;一站式解决您所困扰的所有生产制作流程问题。 普通的免费MES系统只提供简单的基本功能让客户体验&#xff0c;而万界星空MES系统运用低代码的形式开发&a…

Python初刷题笔记

目录 保留小数的方法&#xff1a;​编辑 进制问题如何转换&#xff1a; 大小写如何转换&#xff1a; 删除空格问题&#xff1a; 循环输入的简便方法&#xff1a; 截取某一部分所需要的函数&#xff1a; 字符串处理常用函数小汇总&#xff1a; sort和sorted函数的区别&am…

【Python】数据分析+数据挖掘——掌握Python和Pandas中的单元格替换操作

1. 前言 数据处理和清洗是数据分析和机器学习中至关重要的步骤。在数据处理过程中&#xff0c;我们经常需要对数据集进行清洗和转换&#xff0c;其中单元格替换是一个常用的技术。Python作为一种功能强大且灵活的编程语言&#xff0c;为数据处理提供了丰富的工具和库。Pandas库…

《你不知道的 Chrome 调试技巧》-- 学习笔记

截全屏 ctrl shift p &#xff1a;调出command 然后输入screen 效果 引用上次结果 在console中&#xff0c;想要引用上次的计算结果 使用$_ 添加有条件的断点 右击行号&#xff0c;选择 Add conditional breakpoint...(添加条件断点) 或者右击一个已经设置的断点并且选择…

GC垃圾回收器【学习笔记】

GC&#xff1a;Garbage Collectors 垃圾回收器 C/C&#xff0c;手动回收内存&#xff1b;难调试、门槛高。忘记回收、多次回收等问题 Java、Golang等&#xff0c;有垃圾回收器&#xff1a;自动回收&#xff0c;技术门槛降低 一、如何定位垃圾&#xff1f; https://www.infoq.c…

24考研数据结构-串的定义和基本实现

目录 第四章&#xff1a;串概论数据结构之串&#xff1a;定义、实现与存储结构1. 串的定义2. 串的实现方式2.1 顺序存储2.2 链式存储 3. 串的基本操作4. 串的应用结论 4.1串的定义和实现4.1.1串的定义4.1.2串的基本操作字符集编码 4.1.3串的存储结构1. 定长顺序存储表示基本操作…

海外ASO优化之通过应用商店优化来获得自然用户

应用商店优化需要我们跟踪关键词的数据&#xff0c;从而评估我们的ASO策略有效性。跟踪我们选择的时间段和国家/地区的重要搜索查询的历史排名和应用程序的最佳位置。根据我们关注的每个应用的关键词&#xff0c;位置&#xff0c;特色&#xff0c;评论和更新&#xff0c;立即了…

性能压力测试的重要性与实施方法

性能压力测试是在软件开发过程中评估系统在不同负载条件下的表现和稳定性的关键步骤。这种测试是为了确定系统在正常和峰值负载下的性能表现&#xff0c;以验证系统是否能够满足用户需求&#xff0c;同时发现潜在的性能问题并加以解决。 首先&#xff0c;性能压力测试对于确保系…

【HMS Core】融合搜索无法打开搜索服务连接问题

【关键字】 HMS、搜索服务、融合搜索 【问题描述】 有开发者反馈在集成搜索服务-融合搜索时&#xff0c;出现了无法打开搜索服务连接的问题。 严格按照官方文档集成&#xff0c;配置&#xff0c;权限已添加 searchServiceAbility .connect(new ServiceConnectCallback() { …

牛客网Verilog刷题——VL46

牛客网Verilog刷题——VL46 题目解析答案 题目 根据题目提供的双口RAM代码和接口描述&#xff0c;实现同步FIFO&#xff0c;要求FIFO位宽和深度参数化可配置。电路的接口如下图所示。   双口RAM端口说明&#xff1a; 同步FIFO端口说明&#xff1a; 双口RAM代码如下&#xff…

1、Tomcat

java介绍 Java语言和平台由以下几个主要部分组成&#xff1a; 1、Java编程语言(Java Language)&#xff1a;这是Java的核心部分&#xff0c;包括Java语法、关键字、数据类型、运算符、控制结构等。程序员使用Java语言来编写应用程序的源代码。 2、Java开发工具包(Java Developm…

企业可以申请DV https证书吗

DV https证书是有基础认证的数字证书&#xff0c;所以DV https证书也可以叫DV基础型https证书。DV基础型https证书是众多https证书中既支持个人&#xff0c;也支持企事业单位申请的https证书&#xff0c;所以企事业单位都可以申请DV基础型https证书&#xff0c;不论是企业门户网…

价值 1k 嵌入式面试题-计算机网络 OSI

开门见山 请讲下 OSI 各层协议的主要功能&#xff1f; 常见问题 回答不系统回答不确切无法和实际网络协议做关联对应 答题思路 OSI 代表了开放互联系统中信息从一台计算机的一个软件应用流到另一个计算机的另一个软件应用的参考模型 OSI 包含 7 层&#xff0c;每一层负责特…