老知识复盘-SQL从提交到执行到底经历了什么 | 京东云技术团队

一、什么是SQL

sql(Structured Query Language: 结构化查询语言)是高级的费过程化编程语言,允许用户在高层数据结构上工作, 是一种数据查询和程序设计语言, 也是(ANSI)的一项标准的计算机语言. but… 目前仍然存在着许多不同版本的sql语言,为了与ANSI标准相兼容, 它们必须以相似的方式共同地来支持一些主要的命令(比如SELECT、UPDATE、DELETE、INSERT、WHERE等等).

在标准SQL中, SQL语句包含四种类型

DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据)。

DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别。

DQL(Data Query Language):数据查询语言,用来查询记录(数据)。

DDL(Data Definition Language):数据定义语言,用来定义数据库对象(库,表,列等)

二、如何执行SQL

2.1 mysql

以mysql为例, sql执行流程大致分为以下节点(mysql server层代码, 不包含引擎层事务/log等操作):

mysqlLex: mysql自身的词法分析程序, C++语言开发, 基于输入的语句进行分词, 并解析除每个分词的意义. 分词的本质便是正则表达式的匹配过程. 源码在sql/sql_lex.cc

Bision: 根据mysql定义的语法规则,进行语法解析,语法解析就是生成语法树的过程. 核心是如何涉及合适的存储结构以及相关算法,去存储和遍历所有的信息

语法解析中,生成语法树:

mysql分析器: SQL解析, 针对关键词/非关键词进行提取、解析, 并生成解析语法树. 如果分析到语法错误,会抛出异常: ERROR: You have an error in your SQL syntax. 同时该阶段也会做一些校验, 如不存在字段会抛出异常: unknow column in field list.

引申点:

a. 语法树生成规则

b. mysql的优化规则

2.2 hive sql

Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行,通过自己的SQL 去查询分析需要的内容,这套SQL 简称Hive SQL,使不熟悉mapreduce 的用户很方便的利用SQL 语言查询,汇总,分析数据

hive架构图:

Driver:

输入了sql字符串,对sql字符串进行解析,转化程抽象语法树,再转化成逻辑计划,然后使用优化工具对逻辑计划进行优化,最终生成物理计划(序列化反序列化,UDF函数),交给Execution执行引擎,提交到MapReduce上执行(输入和输出可以是本地的也可以是HDFS/Hbase)见下图的hive架构

hiveSql的执行流程如下:

sql写出来以后只是一些字符串的拼接,所以要经过一系列的解析处理,才能最终变成集群上的执行的作业

(1)Parser:将sql解析为AST(抽象语法树),会进行语法校验,AST本质还是字符串

(2)Analyzer:语法解析,生成QB(query block)

(3)Logicl Plan:逻辑执行计划解析,生成一堆Opertator Tree

(4)Logical optimizer:进行逻辑执行计划优化,生成一堆优化后的Opertator Tree

(5)Phsical plan:物理执行计划解析,生成tasktree

(6)Phsical Optimizer:进行物理执行计划优化,生成优化后的tasktree,该任务即是集群上的执行的作业

结论:经过以上的六步,普通的字符串sql被解析映射成了集群上的执行任务,最重要的两步是 逻辑执行计划优化和物理执行计划优化(图中红线圈画)

Antlr: Antrl是一种语言识别的工具, 基于java开发, 可以用来构造领域语言. 它提供了一个框架,可以通过包含java, C++, 或C#动作(action)的语法描述来构造语言识别器, 编译器和解释器.Antlr完成了hive 词法分析、语法分析、语义分析、中间代码生成的过程.

AST语法树举例:

引申学习:

a. 从hivesql的执行机制可以看出, hive并不适合用于联机事务处理, 无法提供实时查询功能;最适合应用在基于大量不可变数据的批处理作业

b. Antlr的解析流程

c. hive的优化规则

2.3 flink sql

Flink SQL是Flink中最高级的抽象, 可以划分为 SQL --> Table API --> DataStream/DataSetAPI --> Stateful Stream Processing

Flink SQL包含 DML 数据操作语言、 DDL 数据语言, DQL 数据查询语言,不包含DCL语言。

(1)首先,FlinkSQL 底层使用的是 apache Calcite 引擎来处理SQL语句,Calcite会使用 javaCC 做SQL解析,javaCC根据Calcite中定义的 Parser.jj 文件,生成一系列的java代码,生成的java代码会把SQL转换成AST抽象语法树(即SQLNode类型)。

(2)生成的 SqlNode 抽象语法树,他是一个未经验证的抽象语法树,这时 SQL Validator 会获取 Flink Catalog 中的元数据信息来验证 sql 语法,元数据信息检查包括表名,字段名,函数名,数据类型等检查。然后生成一个校验后的SqlNode。

(3)到达这步后,只是将 SQL 解析到 java 数据结构的固定节点上,并没有给出相关节点之间的关联关系以及每个节点的类型信息。

所以,还需要将 SqlNode 转换为逻辑计划,也就是LogicalPlan,在转换过程中,会使用 SqlToOperationConverter 类,来将 SqlNode 转换为 Operation,Operation 会根据SQL语法来执行创建表或者删除表等操作,同时FlinkPlannerImpl.rel()方法会将SQLNode转换成RelNode树,并返回RelRoot。

(4)第4步将执行 Optimize 操作,按照预定义的优化规则 RelOptRule 优化逻辑计划。

Calcite 中的优化器RelOptPlanner有两种,一是基于规则优化(RBO)的HepPlanner,二是基于代价优化(CBO)的VolcanoPlanner。然后得到优化后的RelNode, 再基于Flink里面的rules将优化后的逻辑计划转换成物理计划。

(5)第5步 执行 execute 操作,会通过代码生成 transformation,然后递归遍历各节点,将DataStreamRelNode 转换成DataStream,在这期间,会依次递归调用DataStreamUnion、DataStreamCalc、DataStreamScan类中重写的 translateToPlan方法。递归调用各节点的translateToPlan,实际是利用CodeGen元编成Flink的各种算子,相当于直接利用Flink的DataSet或者DataStream开发程序。

(6)最后进一步编译成可执行的 JobGraph 提交运行。

Flink SQL使用 Apache Calcite 作为解析器和优化器

Calcite : 一种动态数据管理框架,它具备很多典型数据库管理系统的功能 如SQL 解析、 SQL 校验、 SQL 查询优化、 SQL 生成以及数据连接查询等,但是又省略了一些关键的功能,如 Calcite并不存储相关的元数据和基本数据,不完全包含相关处理数据的算法等。

引申学习:

a. flink sql优化规则

三、常见SQL解析引擎

解析引擎开发语言使用场景总结
antlrjavapresto1. 包含三大主要功能: 词法分析器、语法分析器、树解析器2. 支持定义领域语言
calcitejavaCCflink1. 抽象语法树2. 支持使用 FreeMarker 模版引擎扩展语法3. 能够与数据库创建查询

持续补充ing…

四、总结

在实际工作过程中会涉及到相关的sql优化, 比如将非研发的业务老师写的复杂嵌套sql后台自动改为非嵌套执行,提高查询性能. 支持redisSQL, 以标准SQL格式解析成后台可执行的redis命令. 目前采用的开源jsqlparser框架来实现语法树的解析, 好处是操作简单, 只对sql语句进行拆分, 解析成java类的层次结构,支持visitor模式, 与数据库无关. 缺点是只支持常见的SQL语法集, 如若要扩展语法需改其源码, 对代码的侵入性与维护性造成影响.想要做好sql解析优化相关的工作, 还是要深入了解sql的执行原理, 了解各个sql引擎的特点与优劣. 站在架构的角度来思考来思考问题.

工欲善其事,必先利其器.

作者:京东科技 李丹枫

来源:京东云开发者社区 转载请注明来源

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

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

相关文章

迪杰斯特拉算法(C++)

目录 介绍: 代码: 结果: 介绍: 迪杰斯特拉算法(Dijkstras algorithm)是一种用于计算加权图的单点最短路径的算法。它是由荷兰计算机科学家Edsger W. Dijkstra在1956年发明的。 该算法的思路是&#xf…

振南技术干货集:制冷设备大型IoT监测项目研发纪实(4)

注解目录 1.制冷设备的监测迫在眉睫 1.1 冷食的利润贡献 1.2 冷设监测系统的困难 (制冷设备对于便利店为何如何重要?了解一下你所不知道的便利店和新零售行业。关于电力线载波通信的论战。) 2、电路设计 2.1 防护电路 2.1.1 强电防护 …

11月22日星期三今日早报简报微语报早读

11月22日星期三,农历十月初十,早报微语早读。 1、我国自主研发气象无人艇实现首次海上云雾立体观测。 2、国家统计局与国家医疗保障局签署数据共享利用合作协议。 3、三部门:加强全国重点文物保护单位内古树名木保护。 4、油价4连降&#xf…

Java 1.0 到 Java 17历程

Java 自 1995 年发布以来,经历了多个版本的更新,每个版本都引入了新的特性和改进。以下是从 Java 1.0 到 Java 17(截至我所掌握的最新信息)的主要新特性概览: Java 1.0 (1996) 初始版本,包含了Java的基础…

VSCode配置用户代码段以及常用快捷键汇总

一:前言 VSCode 是一款由微软开发的轻量级编辑器,可以安装插件和兼容多种语言。其本身已经是目前前端开发所使用的主流软件。那么在开发过程中,我们经常要写很多重复性的代码,比如当你去新建一个 .vue 页面的时候,往往…

在Ubuntu18.04安装适合jdk8的eclipse

直接在Ubuntu软件那里下载的eclipse不能用,下载后启动会报错:Eclipse An error has occurred. See the log file/home/hadoop/.eclipse/ org.eclipse.platform_3.8_155965261/ configuration/1700567835954.log 上网搜索方法,按教程说的修改e…

Deepmind开发音频模型Lyria 用于生成高品质音乐;创建亚马逊新产品评论摘要

🦉 AI新闻 🚀 Deepmind开发音频模型Lyria 用于生成高品质音乐 摘要:Deepmind推出名为Lyria的音频模型,可生成带有乐器和人声的高品质音乐。Lyria模型针对音乐生成的挑战,解决了音乐信息密度高、音乐序列中的连续性维…

redis的一些操作

文章目录 清空当前缓存和所有缓存配置内存大小,防止内存饱满设置内存淘汰策略键过期机制 清空当前缓存和所有缓存 Windows环境下使用命令行进行redis缓存清理 redis安装目录下输入cmdredis-cli -p 端口号flushdb 清除当前数据库缓存flushall 清除整个redis所有缓存…

【Linux】深入理解系统文件操作(1w字超详解)

1.系统下的文件操作: ❓是不是只有C\C有文件操作呢?💡Python、Java、PHP、go也有,他们的文件操作的方法是不一样的啊 1.1对于文件操作的思考: 我们之前就说过了:文件内容属性 针对文件的操作就变成了对…

阿里云云盘IOPS与IO吞吐

1、云盘IOPS 存储类别ESSD云盘SSD云盘性能级别PL3PL2PL1无 最大IOPS计算公式 (存储空间单位:GB) min{180050*存储空间, 1000000, 实例规格最大IOPS}min{180050*存储空间, 100000, 实例规格最大IOPS}min{180050*存储空间, 50000, 实例规格最大…

悄悄上线:CSS @starting-style 新规则

最近 Chrome 117,CSS 又悄悄推出了一个新的的规则,叫做starting-style。从名称上来看,表示定义初始样式。那么,具体是做什么的?有什么用?一起了解一下吧 一、快速了解 starting-style 通常做一个动画效果…

µC/OS-II---中断相关名词

中断相关名词 中断和中断服务程序进入临界区和禁用中断任务的临界区代码和ISR的临界区代码 中断和中断服务程序 中断是指处理器在执行程序的过程中,由硬件或软件触发的一种事件。当中断事件发生时,处理器会立即中断当前的执行流程,保存当前的…

【用unity实现100个游戏之16】Unity中程序化生成的2D地牢5(附项目源码,完结)

文章目录 最终效果前言生成墙壁优化方法一、使用rule tile方法二、使用代码生成墙壁补充最终效果后续参考源码完结最终效果 前言 本期是本项目最后一期,主要是进行墙壁的生成优化和补充一下剩下了的其他内容 生成墙壁优化 方法一、使用rule tile 我这里大概给个rule tile参…

ASM字节码操作类库(打开java语言世界通往字节码世界的大门) | 京东云技术团队

前言:授人以鱼不如授人以渔,应用asm的文章有很多,简单demo的也很多,那么ASM都具备哪些能力呢?如何去学习编写ASM代码呢?什么样的情景需要用到ASM呢?让我们带着这些问题阅读这篇文章吧。 这里由…

abap qm01创建质检通知单相关bapi:IQS4_CREATE_NOTIFICATION

网上查找关于创建质检通知单相关bapi时,基本都是显示BAPI_QUALNOT_CREATE该函数,经查看,该函数缺少QF01缺陷记录的参数,比如检验批,退货数量等字段,同时即使该函数成功执行,生成的通知单也是有问…

搜索记录及使用缓存的设计思路

目录 背景: 思路: 问题 实现 背景: 最近业务写到检索这块的内容,设计到搜索记录的增删操作。考虑到频繁写库操作所以使用缓存技术 redis 和 cacha。 思路: 查询:先查内存查缓存在查询数据库,查询数据库先更新内存…

电脑开机过程中,程序的启动的顺序是怎么样的?

电脑的启动过程涉及多个步骤,程序按照特定的顺序启动。这个过程通常如下: 电源开启: 当你按下电源按钮时,电源供应器(PSU)开始向电脑的各个组件供电。 自检加电(POST): 这是电脑启动过程的第一步。在这个阶段,基本输入输出系统(BIOS)或统一可扩展固件接口(UEFI)执行…

Ubuntu 搭建FTP服务

在Linux中使用的FTP是vsftp,Ubuntu中安装vsftp: apt install vsftpd 配置文件在/etc路径下,会出现两个配置文件: /etc/vsftpd.conf :主配置文件 /etc/ftpusers:指定那些用户不能访问FTP服务器,这里的用…

RunwayGen2上线全新控制功能「运动笔刷」

从8月份开始,我就在各种场合表达过,AI视频现在最痛苦的点,是控制性极差。Gen2的语义理解本来就差,还几乎没有任何可控性,只有那几个镜头控制,剩下全靠roll。但是你roll的,全是白花花的银子啊...…

每日一练:X加上100为完全平方数,再加上168仍然为完全平方数

题目 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 实现方式1 解题思路 设整数为x,根据题意建立方程:   (1) x 100 是一个完全平方数,即存在整数a满…