您当前的位置:首页 > 电脑百科 > 数据库 > 百科

SQL从提交到执行到底经历了什么

时间:2023-11-22 12:50:15  来源:京东云开发者  作者:

一、什么是 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 等操作):

SQL从提交到执行到底经历了什么

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

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

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

SQL从提交到执行到底经历了什么

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 架构图:

SQL从提交到执行到底经历了什么

Driver:

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

hiveSql 的执行流程如下:

SQL从提交到执行到底经历了什么

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 语法树举例:

SQL从提交到执行到底经历了什么

引申学习:

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 语言。

SQL从提交到执行到底经历了什么

(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 解析引擎

SQL从提交到执行到底经历了什么

持续补充 ing...

四、总结

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

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

 

作者:京东科技 李丹枫
来源:京东云开发者社区 转载请注明来源


Tags:SQL   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
MySQL 核心模块揭秘
server 层会创建一个 SAVEPOINT 对象,用于存放 savepoint 信息。binlog 会把 binlog offset 写入 server 层为它分配的一块 8 字节的内存里。 InnoDB 会维护自己的 savepoint...【详细内容】
2024-04-03  Search: SQL  点击:(5)  评论:(0)  加入收藏
原来 SQL 函数是可以内联的!
介绍在某些情况下,SQL 函数(即指定LANGUAGE SQL)会将其函数体内联到调用它的查询中,而不是直接调用。这可以带来显著的性能提升,因为函数体可以暴露给调用查询的规划器,从而规划器...【详细内容】
2024-04-03  Search: SQL  点击:(3)  评论:(0)  加入收藏
如何正确选择NoSQL数据库
译者 | 陈峻审校 | 重楼Allied Market Research最近发布的一份报告指出,业界对于NoSQL数据库的需求正在持续上升。2022年,全球NoSQL市场的销售额已达73亿美元,预计到2032年将达...【详细内容】
2024-03-28  Search: SQL  点击:(13)  评论:(0)  加入收藏
MySQL 核心模块揭秘,你看明白了吗?
为了提升分配 undo 段的效率,事务提交过程中,InnoDB 会缓存一些 undo 段。只要同时满足两个条件,insert undo 段或 update undo 段就能被缓存。1. 关于缓存 undo 段为了提升分...【详细内容】
2024-03-27  Search: SQL  点击:(10)  评论:(0)  加入收藏
MySQL:BUG导致DDL语句无谓的索引重建
对于5.7.23之前的版本在评估类似DDL操作的时候需要谨慎,可能评估为瞬间操作,但是实际上线的时候跑了很久,这个就容易导致超过维护窗口,甚至更大的故障。一、问题模拟使用5.7.22...【详细内容】
2024-03-26  Search: SQL  点击:(8)  评论:(0)  加入收藏
从 MySQL 到 ByteHouse,抖音精准推荐存储架构重构解读
ByteHouse是一款OLAP引擎,具备查询效率高的特点,在硬件需求上相对较低,且具有良好的水平扩展性,如果数据量进一步增长,可以通过增加服务器数量来提升处理能力。本文将从兴趣圈层...【详细内容】
2024-03-22  Search: SQL  点击:(23)  评论:(0)  加入收藏
在 SQL 中写了 in 和 not in,技术总监说要炒了我……
WHY?IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢?1、效率低项目中遇到这么个情况:t1表 和 t2表 都是150w条数据,600M的样子,都不算大。但是这样一句查询 ↓select *...【详细内容】
2024-03-18  Search: SQL  点击:(5)  评论:(0)  加入收藏
应对慢SQL的致胜法宝:7大实例剖析+优化原则
大促备战,最大的隐患项之一就是慢SQL,对于服务平稳运行带来的破坏性最大,也是日常工作中经常带来整个应用抖动的最大隐患,在日常开发中如何避免出现慢SQL,出现了慢SQL应该按照什...【详细内容】
2024-03-14  Search: SQL  点击:(4)  评论:(0)  加入收藏
MySQL自增主键一定是连续的吗?
测试环境:MySQL版本:8.0数据库表:T (主键id,唯一索引c,普通字段d)如果你的业务设计依赖于自增主键的连续性,这个设计假设自增主键是连续的。但实际上,这样的假设是错的,因为自增主键不...【详细内容】
2024-03-10  Search: SQL  点击:(5)  评论:(0)  加入收藏
准线上事故之MySQL优化器索引选错
1 背景最近组里来了许多新的小伙伴,大家在一起聊聊技术,有小兄弟提到了MySQL的优化器的内部策略,想起了之前在公司出现的一个线上问题,今天借着这个机会,在这里分享下过程和结论...【详细内容】
2024-03-07  Search: SQL  点击:(26)  评论:(0)  加入收藏
▌简易百科推荐
向量数据库落地实践
本文基于京东内部向量数据库vearch进行实践。Vearch 是对大规模深度学习向量进行高性能相似搜索的弹性分布式系统。详见: https://github.com/vearch/zh_docs/blob/v3.3.X/do...【详细内容】
2024-04-03  京东云开发者    Tags:向量数据库   点击:(4)  评论:(0)  加入收藏
原来 SQL 函数是可以内联的!
介绍在某些情况下,SQL 函数(即指定LANGUAGE SQL)会将其函数体内联到调用它的查询中,而不是直接调用。这可以带来显著的性能提升,因为函数体可以暴露给调用查询的规划器,从而规划器...【详细内容】
2024-04-03  红石PG  微信公众号  Tags:SQL 函数   点击:(3)  评论:(0)  加入收藏
如何正确选择NoSQL数据库
译者 | 陈峻审校 | 重楼Allied Market Research最近发布的一份报告指出,业界对于NoSQL数据库的需求正在持续上升。2022年,全球NoSQL市场的销售额已达73亿美元,预计到2032年将达...【详细内容】
2024-03-28    51CTO  Tags:NoSQL   点击:(13)  评论:(0)  加入收藏
为什么数据库连接池不采用 IO 多路复用?
这是一个非常好的问题。IO多路复用被视为是非常好的性能助力器。但是一般我们在使用DB时,还是经常性采用c3p0,tomcat connection pool等技术来与DB连接,哪怕整个程序已经变成以...【详细内容】
2024-03-27  dbaplus社群    Tags:数据库连接池   点击:(12)  评论:(0)  加入收藏
八个常见的数据可视化错误以及如何避免它们
在当今以数据驱动为主导的世界里,清晰且具有洞察力的数据可视化至关重要。然而,在创建数据可视化时很容易犯错误,这可能导致对数据的错误解读。本文将探讨一些常见的糟糕数据可...【详细内容】
2024-03-26  DeepHub IMBA  微信公众号  Tags:数据可视化   点击:(6)  评论:(0)  加入收藏
到底有没有必要分库分表,如何考量的
关于是否需要进行分库分表,可以根据以下考量因素来决定: 数据量和负载:如果数据量巨大且负载压力较大,单一库单一表可能无法满足性能需求,考虑分库分表。 数据增长:预估数据增长...【详细内容】
2024-03-20  码上遇见你  微信公众号  Tags:分库分表   点击:(13)  评论:(0)  加入收藏
在 SQL 中写了 in 和 not in,技术总监说要炒了我……
WHY?IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢?1、效率低项目中遇到这么个情况:t1表 和 t2表 都是150w条数据,600M的样子,都不算大。但是这样一句查询 ↓select *...【详细内容】
2024-03-18  dbaplus社群    Tags:SQL   点击:(5)  评论:(0)  加入收藏
应对慢SQL的致胜法宝:7大实例剖析+优化原则
大促备战,最大的隐患项之一就是慢SQL,对于服务平稳运行带来的破坏性最大,也是日常工作中经常带来整个应用抖动的最大隐患,在日常开发中如何避免出现慢SQL,出现了慢SQL应该按照什...【详细内容】
2024-03-14  京东云开发者    Tags:慢SQL   点击:(4)  评论:(0)  加入收藏
过去一年,我看到了数据库领域的十大发展趋势
作者 | 朱洁策划 | 李冬梅过去一年,行业信心跌至冰点2022 年中,红衫的一篇《适应与忍耐》的报告,对公司经营提出了预警,让各个公司保持现金流,重整团队,想办法增加盈利。这篇报告...【详细内容】
2024-03-12    InfoQ  Tags:数据库   点击:(25)  评论:(0)  加入收藏
SQL优化的七个方法,你会哪个?
一、插入数据优化 普通插入:在平时我们执行insert语句的时候,可能都是一条一条数据插入进去的,就像下面这样。INSERT INTO `department` VALUES(1, '研发部(RD)', &#39...【详细内容】
2024-03-07  程序员恰恰  微信公众号  Tags:SQL优化   点击:(19)  评论:(0)  加入收藏
站内最新
站内热门
站内头条