网站的规划和建设方案,江阴做网站的地方,wordpress wowway,设计网免费一、什么是SQL
sql(Structured Query Language: 结构化查询语言)是高级的费过程化编程语言,允许用户在高层数据结构上工作, 是一种数据查询和程序设计语言, 也是(ANSI)的一项标准的计算机语言. but… 目前仍然存在着许多不同版本的sql语言,为了与ANSI标准相兼容, 它们必须以相…一、什么是SQL
sql(Structured Query Language: 结构化查询语言)是高级的费过程化编程语言,允许用户在高层数据结构上工作, 是一种数据查询和程序设计语言, 也是(ANSI)的一项标准的计算机语言. but… 目前仍然存在着许多不同版本的sql语言,为了与ANSI标准相兼容, 它们必须以相似的方式共同地来支持一些主要的命令(比如SELECT、UPDATE、DELETE、INSERT、WHERE等等).
在标准SQL中, SQL语句包含四种类型
DMLData Manipulation Language数据操作语言用来定义数据库记录数据。
DCLData Control Language数据控制语言用来定义访问权限和安全级别。
DQLData Query Language数据查询语言用来查询记录数据。
DDLData 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写出来以后只是一些字符串的拼接所以要经过一系列的解析处理才能最终变成集群上的执行的作业
1Parser将sql解析为AST抽象语法树会进行语法校验AST本质还是字符串
2Analyzer语法解析生成QBquery block
3Logicl Plan逻辑执行计划解析生成一堆Opertator Tree
4Logical optimizer:进行逻辑执行计划优化生成一堆优化后的Opertator Tree
5Phsical plan物理执行计划解析生成tasktree
6Phsical 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 转换为 OperationOperation 会根据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引擎的特点与优劣. 站在架构的角度来思考来思考问题.
工欲善其事必先利其器. 作者京东科技 李丹枫 来源京东云开发者社区 转载请注明来源