聊聊GaussDB AP是如何执行SQL的
本文分享自华为云社区《GaussDB AP是如何执行SQL的》,作者:yd_270088468。
前言
介绍GaussDB AP各组件是如何协调工作的,会着重介绍SQL引擎。
1、SQL引擎组件和SQL生命周期
Parser: 词法/语法分析模块。词法分析会从SQL字符串中解析出一个个单词,作为语法分析的输入。语法分析可以想象成是一个"正则表达式",但远比正则表达式复杂,它定义了所有SQL类型的语法规则以及操作符的优先级和结合律。语法分析结束后,会生成一个Parse Tree,作为语义分析模块的输入。比如一个SQL是SELECT id,data FROM tbl_a WHERE id < 300 ORDER by data;,语法解析生成的Parse Tree如下所示:
Analyzer: 语义分析模块。语义分析会访问数据库中的对象,检查表是否存在、列是否合法,并将表、排序列、投影列等转化为内部对象ID。另外,它还会检查SQL语义是否正确合法,比如Aggregate函数在where子句中是不合法的。经过语义分析后,Parse Tree会转化成Query Tree,作为查询重写模块的输入。Query Tree的结构与Parse Tree有点类似,但在内容上更加丰富,包括Query Tree保存的是数据库内部的对象信息、多了一些Flag标记等。语义分析生成的Query树如下所示:
Rewriter: 查询重写模块。查询重写模块会根据用户定义的规则对查询进行重写,实际是对Query Tree中的成员进行修改或者替换。Rewrite过程如下所示:
Planner: 优化器模块。优化器的输入是Query Tree,输出Plan Tree,用来指导执行器执行,比如如何join,如何扫描数据,如何排序等。
Executor: 执行器模块。根据优化器输出的Plan Tree,进行初始化、执行,执行的时候会调用存储引擎的接口,这里不做展开。
2、SQL执行整体架构
步骤一:业务通过ELB下发SQL给CN,SQL可以是DDL,DML,DCL。
步骤二:CN判断SQL类型,如果SQL类型是DDL/DCL,不用生成plan,将SQL发送到其他CN和所有DN,在所有CN/DN上执行。如果SQL类型是DML,对于不需要使用stream算子的(可以分成3小类),会将SQL直接发给各DN执行,对于需要使用stream算子的,会生成plan下发给DN执行。
步骤三:DN执行DML过程中,可能会从其他DN获取数据,DWS提供了三种stream算子(Redistribute/Broadcast/Gather),降低数据在DN节点间的流动。
步骤四:DN将结果集返回给CN进行汇总。
步骤五:CN将汇总后的结果返回给业务。
3、DDL在CN/DN如何交互
3.1 单DDL的情况
3.2 并发DDL的情况
为了避免并发DDL造成死锁,默认开启enable_parallel_ddl,控制从所有CN下发的DDL都使用同一个CN作为起点开始执行。
消息序列图说明
前提:CN 1,CN 2,CN 3上各收到一条对表test进行DDL操作的请求。CN 1为被选定的第一个执行DDL的节点。
T1:CN 2不是第一个执行DDL操作的节点,所以CN 2将Command 2命令发送给第一个执行的节点CN 1,然后等待CN 1回复;
T2:CN 3也不是第一个执行DDL操作的节点,所以CN 3将Command 3命令发送给第一个执行的节点CN 1,然后等待CN1回复;
T3:CN 1是第一个执行DDL操作的节点,故按基线原有逻辑执行,即先在本地执行;
T4:CN 1执行Command 2,对表test拿锁。Command 2执行完成后,CN 1告知CN2:Command 2在我上面已经完成。此时,Command 1和Command 3拿不到锁,处于等待状态。
T5:CN 2收到CN 1的Command 2执行完毕的回复之后,给CN 3发送command 2命令,等待CN 3的回复。
T6:CN 3执行command 2,回复执行结果给CN 2;
T7:CN 2将command 2发送给DN1,DN2,DN3,要求它们在本地执行并等待他们的回复;
T8:DN1,DN2,DN3分别在本地执行Command 2,回复CN 2执行结果;
T9:CN 2本地执行Command 2,成功后提交,至此集群中所有的CN和DN全部放锁,Command 2执行完毕。
T10:CN 1执行Command 3,对表test拿锁。Command 3执行完成后,CN 1告知CN3:Command 3在我上面已经完成。此时,Command 1拿不到锁,处于等待状态。
T11:CN 3收到CN 1的Command 3执行完毕的回复之后,给CN 2发送command 3命令,等待CN 2的回复。
T12:CN 2执行command 3,回复执行结果给CN 3;
T13:CN 3将command 3发送给DN1,DN2,DN3,要求它们在本地执行并等待他们的回复;
T14:DN1,DN2,DN3分别在本地执行Command 3,回复CN 3执行结果;
T15:CN 3本地执行Command 3,成功后提交,至此集群中所有的CN和DN全部放锁,Command 3执行完毕。
T16:CN 1将Command 1发送给CN2,CN3,并等待他们的回复;
T17:CN2,CN3分别在本地执行Command 1,回复执行结果给CN 1;
T18:CN 1将command 1发送给DN1,DN2,DN3,要求它们在本地执行并等待他们的回复;
T19:DN1,DN2,DN3分别在本地执行Command 1,回复CN 1执行结果;
T20:CN 1本地执行Command 1,成功后提交,至此集群中所有的CN和DN全部放锁,Command 3执行完毕。
从上面实现可以看到,其中心思想是将多CN上并发的DDL操作串行化,即指定一个最先执行的CN,所有的DDL都必须先在这个CN上执行完成后才可以在别的节点上执行。这样的话,在这个被指定的CN上面,DDL操作就是串行的,拿不到锁的DDL会等待,但不再会出现拿不到锁的死锁情况。
4、DML执行计划生成
4.1 CBO模型
CBO: Cost-Based Optimization也即"基于代价的优化器",相对于RBO(Rule-Based Optimization),CBO对数据很敏感,执行计划更灵活,当数据量变化的时候,CBO往往能生成更优的执行计划。
CBO 的基本优化流程:搜索引擎利用转换规则,对输入的逻辑执行计划进行(逻辑/物理)转换,构造出执行计划的搜索空间。之后,利用代价模型对搜索空间中的每一个执行计划进行代价估算,选出代价最低的物理执行计划。而代价估算的过程离不开基数估计:它利用各个表、列的统计信息,估算出各算子的输入行数、选择率等信息,提供给算子的代价模型,从而估算出查询计划的代价。
DWS优化器是基于代价的优化器(CBO),它可以为每一条SQL构造出搜索空间,并根据数据的统计信息、基数估计、算子代价模型,为搜索空间中的执行机计划估算出执行所需要的代价(CPU/MEM/IO/NET),最终选出代价最小的执行计划作为SQL的具体执行方式。
4.2 搜索空间
采用Cascade(动态规划)/GEQO(遗传基因)的方式进行计划搜索。通过Cascade算法可以实现精确计算,但时间复杂度高,适用于表连接较少的情况。GEQO是非精确计算的方法,适用于表很多的情况。
4.3 统计信息
包括逻辑表的行数,列的非重复值数(NDV),列Null值信息等。
4.4 基数估计
基数估计会估算各个算子中间结果的行数或基数等信息,例如Join输出行数,Agg会产生的Group数量等等。
4.5 算子代价
对于同类算子,将所有实现算子的消耗(代价)均计算出来,选择代价最小的。
输入:两个表的大小、Join列的数据特征、有序性、可用内存大小work_mem;
输出:算子的代价(消耗时间的维度)
4.6 分布式计划
序号 |
分类 |
作用 |
执行原理 |
适用场景 |
---|---|---|---|---|
1 |
CN下发语句 |
生成完全下推语句的计划(FQS计划) |
各DN分别根据下推语句生成执行计划,进行执行,执行结果在CN上进行汇总(FQS,即Fast Query Shipping) |
各DN执行时无数据交互,像基表扫描的场景 |
2 |
CN下发语句 |
生成发送语句的分布式计划(部分下推计划) |
CN下推原语句的部分语句(通常为基表扫描)到DN,各DN分别根据下推语句生成执行计划,执行后将结果发送给CN,CN执行剩余计划 |
不能满足1,3,4的极端场景,性能非常差。目前不支持下推的特征主要有:record数据类型、volatile函数等 |
3 |
CN下发语句 |
生成CN轻量化的计划 |
由DN生成执行计划返回结果 |
只有单DN执行语句,且DN结果即为最终返回结果 |
4 |
CN生成计划 |
生成下发Plan的分布式计划(Stream计划) |
CN根据原语句生成计划,下发给DN进行执行,各DN执行过程中存在数据交互(Stream操作符) |
各DN执行时有数据交互,AP场景下的复杂语句 |
前3个计划都是CN下发语句给DN,第4个计划是CN生成计划,将计划下发给DN,第4个计划也被称为stream计划,是最为常用的计划。
为什么会有下发语句的计划?
CN生成执行计划,需要耗费较多CPU资源,且计划较原始语句大许多,下发语句对于CN以及网络传输的开销小很多。
号外!
华为将于2023年9月20-22日,在上海世博展览馆和上海世博中心举办第八届华为全联接大会(HUAWEICONNECT 2023)。本次大会以“加速行业智能化”为主题,邀请思想领袖、商业精英、技术专家、合作伙伴、开发者等业界同仁,从商业、产业、生态等方面探讨如何加速行业智能化。
我们诚邀您莅临现场,分享智能化的机遇和挑战,共商智能化的关键举措,体验智能化技术的创新和应用。您可以:
- 在100+场主题演讲、峰会、论坛中,碰撞加速行业智能化的观点
- 参观17000平米展区,近距离感受智能化技术在行业中的创新和应用
- 与技术专家面对面交流,了解最新的解决方案、开发工具并动手实践
- 与客户和伙伴共寻商机
感谢您一如既往的支持和信赖,我们热忱期待与您在上海见面。
大会官网:https://www.huawei.com/cn/events/huaweiconnect
欢迎关注“华为云开发者联盟”公众号,获取大会议程、精彩活动和前沿干货。
聊聊GaussDB AP是如何执行SQL的的更多相关文章
- 详解GaussDB(DWS) explain分布式执行计划
摘要:本文主要介绍如何详细解读GaussDB(DWS)产生的分布式执行计划,从计划中发现性能调优点. 前言 执行计划(又称解释计划)是数据库执行SQL语句的具体步骤,例如通过索引还是全表扫描访问表中的 ...
- 探索GaussDB(DWS)的过程化SQL语言能力
摘要:在当前GaussDB(DWS)的能力中主要支持两种过程化SQL语言,即基于PostgreSQL的PL/pgSQL以及基于Oracle的PL/SQL.本篇文章我们通过匿名块,函数,存储过程向大家介 ...
- 4.5 .net core下直接执行SQL语句并生成DataTable
.net core可以执行SQL语句,但是只能生成强类型的返回结果.例如var blogs = context.Blogs.FromSql("SELECT * FROM dbo.Blogs& ...
- SQL SERVER 2008复制数据库时发生执行SQL Server代理作业错误
1. 情况说明 在利用SQL SERVER数据库复制向导,能够很方便的将一个数据库从一台服务器复制到另一台服务器上,具体操作步骤也十分简单. 不过在实际操作过程常发生“执行SQL SERVER代理作业 ...
- 三种执行SQL语句的的JAVA代码
问题描述: 连接数据库,执行SQL语句是必不可少的,下面给出了三种执行不通SQL语句的方法. 1.简单的Statement执行SQL语句.有SQL注入,一般不使用. public static voi ...
- access基本操作(c#操作,远程连接,执行sql,加密,备份)
前言 最近项目用到了access,是的就是access,工作在桌面型的小数据库应用还是会用到的,如果你确定永远不会遇到access的操作,请忽略此篇文章 1.vs配置access 既然是数据库,就少不 ...
- Entity Framework Code First执行SQL语句、视图及存储过程
1.Entity Framework Code First查询视图 Entity Framework Code First目前还没有特别针对View操作的方法,但对于可更新的视图,可以采用与Table ...
- spring boot 配置启动后执行sql, 中文乱码
spring.datasource.schema指定启动后执行的sql文件位置. 我发现中文乱码,原因是没有指定执行sql script encoding: spring: datasource: u ...
- EFCore执行Sql语句的方法:FromSql与ExecuteSqlCommand
前言 在EFCore中执行Sql语句的方法为:FromSql与ExecuteSqlCommand:在EF6中的为SqlQuery与ExecuteSqlCommand,而FromSql和SqlQuery ...
- cmd执行SQL语句
首先新建txt文本,复制粘帖以下内容,保存为cmd执行SQL.bat.注意是bat文件 osql -S 服务器名称 -d 数据库 -U 登录名 -P 密码 -i 盘符:\文件夹\文件.sql
随机推荐
- 深入理解 Skywalking Agent
概述 Agent 功能介绍 + 整体结构 + 设计 插件机制详解 Trace Segment Span 详解 异步 Trace 详解 如何正确地编写插件并防止内存泄漏 扩展:如何基于 Skywalki ...
- IEEE754浮点数与字节数互转工具
前段时间做的一个小工具,分享一下. 提供浮点数和字节的相互转换. 下载
- mysql查看索引利用率
-- mysql查看索引利用率 -- 如果很慢把排序去掉,加上limit 并且在where条件中限定表名. -- cardinality越接近0,利用率越低 SELECT t.TABLE_SCHEMA ...
- (Good topic)圆圈中最后剩下的数字(leetcode 3.30每日打卡)
著名的约瑟夫问题: 0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数字组成一个圆圈,从数字0开 ...
- Android RTL 语言适配
RTL 语言,即 right to left language,也就是右对齐的语言,与一般语言按照左对齐的方式不同,需要进行特别适配. AndroidManifest.xml 文件中,增加 andro ...
- .net 温故知新【13】:Asp.Net Core WebAPI 缓存
一.缓存 缓存指在中间层中存储数据的行为,该行为可使后续数据检索更快. 从概念上讲,缓存是一种性能优化策略和设计考虑因素. 缓存可以显著提高应用性能,方法是提高不常更改(或检索成本高)的数据的就绪性. ...
- 工厂模式(Factory Method)
模式定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使得一个类的实例化延迟(目的:解耦)到子类. 要点总结 Factory Method模式用于隔离类对象的使用 ...
- Spyder5老是闪退报错 "Blowfish has been deprecated "的解决方法
目录 一.前言 我的运行环境 二.解读报错 三.解决方法 四.打开spyder5 一.前言 本人在学习python时图省事选择直接安装Anaconda3,用spyder5来进行学习,可是比较蛋疼的是安 ...
- STA分析-复制
1 静态时序分析(Static Timing Analysis)静态时序分析(Static Timing Analysis):静态执行对于数字设计时序的分析,不依赖于施加在输入端口上的激励,验证设计是 ...
- 快速入门:使用 .NET Aspire 组件实现缓存
前言 云原生应用程序通常需要各种类型的可扩展缓存解决方案来提高性能..NET Aspire 组件简化了连接到流行的缓存服务(例如 Redis)的过程,今天小编就为大家简单介绍一下如何使用 .NET A ...