数据库物理计划执行指南

一、背景介绍

伴随信息技术地迅猛发展和应用范围地逐步扩大,数据库已成为企业存储与管理数据的重要工具。但数据量激增以及用户访问需求的与日剧增,数据库性能也将面临巨大挑战。

好在数据库物理计划执行是解决数据库性能问题的重要手段之一,我们可以通过对数据库物理结构进行合理规划和优化,提高数据库的查询速度、降低存储空间的占用率,从而提高数据库整体性能。

二、物理计划基础概念

2.1 算子执行

在数据库系统中,算子执行是指查询语句中的各种操作符(算子)实际执行的过程。数据库查询通常由一个或多个操作符组成,这些操作符包括选择、投影、连接、排序等,它们按照特定的顺序和方式执行来完成查询任务。以下是算子执行的常规过程:

  • 解析查询语句

数据库系统首先会解析查询语句,识别其中的各种操作符和操作数,并构建查询执行计划(Query Execution Plan)。

  • 查询优化

在执行计划构建过程中,数据库系统会进行查询优化,尝试找到最有效的执行计划以提高查询性能。其中会涉及到选择合适的索引、调整连接顺序、重新排列操作等优化策略。

  • 执行计划生成

一旦查询优化完成,数据库系统会生成最终的执行计划,该计划描述了执行查询所需的具体步骤和顺序,以及每个步骤所需的算子。

  • 算子执行

数据库系统按照执行计划中描述的顺序逐步执行各个算子。每个算子通常都会对输入的数据进行一些处理,并生成输出,供下一个算子使用。

  • 结果返回

最后,当所有算子执行完成后,数据库系统将返回执行结果给用户或者应用程序。

整个执行过程如图所示,通过下述步骤,数据库系统能够高效地执行各种复杂的查询,并返回用户所需的结果,优化算子执行过程是提高数据库性能的关键之一。

在这里插入图片描述

2.2 物理计划

在数据库管理系统中,物理计划是指将逻辑查询转换为一系列物理操作的执行计划。物理计划是针对数据库物理结构而言的,它决定了数据库访问方式、数据存储方式、数据传输方式等,这些因素都将对数据库性能产生非常大的影响。

物理计划是将逻辑查询转化为物理操作的执行计划。数据库中的各种组件,如执行器、扫描器、排序器、连接器、聚合器、索引、缓存和分区等,都是物理计划执行的基础概念。

三、KaiwuDB 物理计划

3.1 物理计划组成

KaiwuDB 是一个分布式数据库系统,其物理计划与传统的关系型数据库系统有所不同,因为它需要考虑分布式数据存储和处理的特点。KaiwuDB 的物理计划通常会涉及到以下几个方面:

  • 数据分布和复制

KaiwuDB 将数据分布到不同的节点上,并通过数据复制确保数据的高可用性和容错性。因此在执行查询时,物理计划需要考虑到数据的分布情况,以及在哪些节点上复制了查询所需的数据。

  • 分布式查询处理

KaiwuDB 支持将查询分布到不同的节点上并行执行,以提高查询的性能。物理计划会涉及到如何将查询分解为多个子查询,并将这些子查询发送到不同的节点上执行,然后将结果合并。

  • 数据传输和网络通信

由于数据存储在不同的节点上,KaiwuDB 的物理计划需要考虑如何在节点之间传输数据,并且需要最小化网络通信的开销。

  • 分布式索引和统计信息

KaiwuDB 支持分布式索引和统计信息,物理计划会根据索引和统计信息来选择最优的查询执行路径,以提高查询的性能。

  • 节点资源管理

在执行查询时,KaiwuDB 的物理计划需要考虑每个节点的资源利用情况,以避免节点过载或资源不均衡导致的性能问题。

总体来说,KaiwuDB 的物理计划与传统的关系型数据库系统类似,但在处理分布式数据存储和查询处理时有所不同。优化 KaiwuDB 的物理计划通常需要考虑到分布式环境下的特殊情况,以确保查询在整个集群中的高效执行。

3.2 KaiwuDB 物理计划构造类图

在这里插入图片描述

3.3 KaiwuDB 物理计划生成时序图

在这里插入图片描述

四、KaiwuDB 物理计划样例

样例 1

以一个简单的物理计划为例,该计划表示为两个表 T1 和 T2 的 Join,Join 的等值关系为 T1.k=T2.k,T1 和 T2 的数据都分布在 3 个节点,表示为如下图:

在这里插入图片描述

物理计划会确认数据的分布信息,设置每一个 Tablereader 算子的 Filter、Projection 等操作,最终将生成的几个 Tablereader 加入到物理计划当中。

在这里插入图片描述

将左右计划进行合并:

在这里插入图片描述

findJoinProcessorNodes 函数决定在几个节点做 Join 操作,这里的 Tablereader 算子是 3 节点,所以 Join 算子也会对应构建 3 个节点,因此这里会调用 AddJoinStage 生成 3 个 HashJoiner(不考虑其他 Join 算法的情况下),并且将其左右算子(这里指代图中的 6 个 Tablereader)的 Output 类型改为 OutputRouterSpec_BY_HASH(意味着执行时需要跨节点 Hash 重分布),物理计划视图变为如下图所示:

在这里插入图片描述

然后调用 MergeResultStreams 按照节点数量将 T1 和 T2 的各 3 个 Tablereader 连接到各个 HashJoiner 的左右两端,有向箭头表示 Stream,起于一个算子的 Output,终于另一个算子的 Input,物理计划视图如下,图中的 Output 类型均为 OutputRouterSpec_BY_HASH:

在这里插入图片描述

createPhysPlan 函数生成了物理计划的整体拓扑,FinalizePlan 函数还会在已有的物理计划基础上增加一个 Noop 算子,用于汇总最终的执行结果,然后设置每个算子的 Input 和 Output 所关联的 StreamID,以及 Stream 的类型(StreamEndpointSpec_LOCAL 或者 StreamEndpointSpec_REMOTE,Stream 如果连接相同节点的算子为 StreamEndpointSpec_LOCAL,否则为 StreamEndpointSpec_REMOTE)。在执行完 createPhysPlan–>FinalizePlan 后,整体的物理计划便构建完成,如下图所示:

在这里插入图片描述

样例 2

我们将通过以下 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 等,将相应算子信息添加到物理计划中。

在这里插入图片描述

五、总结

执行器在执行之前需要充分的计划做支撑,查询计划分为 LogicPlan 逻辑计划和 PhysicalPlan 物理计划(分布式计划)。

逻辑计划的数据结构为二叉树,由 AST 经过语义解析、 RBO 和 CBO 后生成,每个节点表示一个对应的关系操作(如关系运算连接,在逻辑计划中会转换为实际的 Join 算法,比如 HashJoin、MergeJoin、LookuopJoin)。

逻辑计划构建完成后,开始物理计划的构建,根据数据分布情况将逻辑计划进行垂直方向拆分,对应的逻辑计划节点转换为特定算子(Processor),算子之间通过 Stream 进行连接,整个物理计划的拓扑结构为一个有向无环图,之后便开始计划的执行。

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

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

相关文章

【技巧】Leetcode 201. 数字范围按位与【中等】

数字范围按位与 给你两个整数 left 和 right ,表示区间 [left, right] ,返回此区间内所有数字 按位与 的结果(包含 left 、right 端点)。 示例 1: 输入:left 5, right 7 输出:4 解题思路 …

服务器数据恢复—KVM虚拟机被误删除如何恢复虚拟磁盘文件?

服务器数据恢复环境&故障: 1台服务器,Linux操作系统EXT4文件系统,部署了数台KVM虚拟机,每台虚拟机包含一个qcow2格式的磁盘文件,和一个raw格式的磁盘文件。 工作人员操作失误删除了3台服务器上的KVM虚拟机&#xf…

13.4 内存管理

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【课程系列04】某客时间AI大模型应用开发实战营

网盘链接 https://pan.baidu.com/s/1blR1eIMDIIp6AbxU4YaK9w 课程收获 "AI大模型应用开发实战营"是一个为期八周的在线课程,旨在教授学员如何开发和应用AI大模型。课程内容从基础理论到实际应用,逐步深入,覆盖了以下要点&#x…

python发邮件给多人的注意事项?如何群发?

python发邮件给多人的效率如何?python发邮件的方法? 在利用Python编程语言实现邮件群发功能时,需要注意许多细节,以确保邮件能有效送达且用户体验良好。AokSend将详细探讨python发邮件给多人时需要注意的各个方面,以帮…

Python邮件加密传输如何实现?有哪些技巧?

Python邮件怎么设置服务器?如何使用Python发送邮件? 为了确保邮件内容在传输过程中不被窃听或篡改,使用加密传输是必不可少的。在使用Python邮件传输时,加密传输是保障信息安全的关键手段。AokSend将详细探讨Python邮件加密传输的…

【C++提高编程-10】----C++ STL常用拷贝和替换算法

🎩 欢迎来到技术探索的奇幻世界👨‍💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…

【Python】类和对象的深入解析

目录 前言 什么是类? 定义一个类 创建对象 访问和修改属性 方法 类的继承 多态 封装 特殊方法 属性装饰器 总结 前言 Python 是一种面向对象的编程语言,它允许程序员通过类和对象来组织和管理代码。面向对象编程(OOP&#xff09…

智慧校园的构建要素是什么

在当今数字时代,智慧校园的构建已成为教育界的热门话题。随着技术的不断进步,学校不再只是传统的教学场所,而是一个充满智能化和创新的环境。那么,智慧校园的构建要素究竟是什么呢? 基础设施建设 高速、稳定的网络覆…

pygame游戏开发

Pygame游戏开发 pygame简介 模块库请参考:pygame官方文档 pygame可以用作游戏开发,但在商业游戏中真正的开发工具却不是pygame。使用pygame开发游戏周期长。 安装pygame 在pycharm中安装第三方库pygame: 在计算机中安装pygame&#xf…

ElasticSearch学习篇13_《检索技术核心20讲》进阶篇之LSM树

背景 学习极客实践课程《检索技术核心20讲》https://time.geekbang.org/column/article/215243,文档形式记录笔记。 内容 磁盘和内存数据读取特点 工业界中数据量往往很庞大,比如数据无法全部加载进内存,无法支持索引的高效实时更新&…

Nature Electronics|微器件在柔性基底上的高密度集成(可穿戴电子/界面调控/电子皮肤/柔性电子)

2024年4月22日,韩国首尔大学Yongtaek Hong和美国斯坦福大学Byeongmoon Lee团队,在《Nature Electronics》上发布了一篇题为“A site-selective integration strategy for microdevices on conformable substrates”的论文。论文内容如下: 一、 摘要 微器件可以被集成在柔性…

【GD32F303红枫派使用手册】第十九节

19.1 实验内容 通过本实验主要学习以下内容: SPI简介 GD32F303 SPI简介 SPI NOR FLASH——GD25Q32ESIGR简介 使用GD32F303 SPI接口实现对GD25Q32ESIGR的读写操作 19.2 实验原理 19.2.1 SPI简介 SPI(Serial Peripheral interface)&…

Django期末重点

思维导图 一、Djanog框架基础 MVT设计模式(model模型【操作数据库】、template模板【页面展示】、view视图【处理请求和调用模型模板】) 二、Django项目框架搭建 创建项目骨架 django-admin startproject 项目名启动服务 (1)p…

STM32(七)———TIM定时器(基本and通用)

文章目录 前言一、通用定时器TIM简介1.STM32F10X系列总共最多有八个定时器:2.三种STM32定时器的区别:3.STM32 的通用定时器功能:4.计数器模式 二、基本定时器1.基本定时器的结构框图2.定时时间的计算3.定时器的结构体和库函数 总结 前言 一个…

如何实现ElementUI动态表头?

可能看到这个标题,有些小伙伴会有些疑惑,动态表头是个什么东西,怎么没听说过? 其实动态表头在企业的项目中用途还是非常广泛的,比如erp系统什么的 那么动态表头是什么呢?说简单点就是让ElementUI的Table表格可以实现自定义表头展示+表头拖拽排序的一个功能 这个东西我…

<Rust><iced>基于rust使用iced构建GUI实例:如何将svg格式转为ico格式图片?

前言 本专栏是Rust实例应用。 环境配置 平台:windows 软件:vscode 语言:rust 库:iced、iced_aw 概述 本文是专栏第4篇实例,依旧是一个图像格式转换程序,基于rust的svg库resvg、图像处理库image以及文件处理库rfd。 流程是先用resvg获取svg图片的数据并将其转为png数据…

20.Dcoker跨宿主机容器通信之overlay

Dcoker跨宿主机容器通信之overlay http://www.cnblogs.com/CloudMan6/p/7270551.html 环境准备,三台机器,主机名为docker01(192.168.111.11)、docker02(192.168.111.12)、docker03(192.168.111…

电子竞赛5——作息时间控制器

一 . 题目要求 用单片机制作作息时间控制器;用四位数码管显示实时时钟(时、分,24小时制、12小时制),有秒闪,小时十位有零消隐;可用数字键或、-键校时(可快速、-)被校位&…

【ARMv8/ARMv9 硬件加速系列 4 -- 加解密 Cryptographic Extension 介绍】

文章目录 ARMv8.0 Cryptographic ExtensionFEAT_AESFEAT_PMULLFEAT_SHA1FEAT_SHA256ARMv8.2 扩展FEAT_SHA512FEAT_SHA3FEAT_SM3FEAT_SM4ARMv8.0 Cryptographic Extension ARMv8.0引入了加密扩展(Cryptographic Extension),旨在加速加密和解密操作。这一扩展通过新增专用指令…