这是我参与「第四届青训营」笔记创作活动的的第1天
一、大数据体系和 SQL
编译原理相关的基础知识
-
词法分析(Lexical Analysis)
词法分析的输入是源程序,输出是识别出的记号流。目的是识别单词。至少分以下几类:关键字(保留字)、标识符、字面量、特殊符号。
-
语法分析(Syntactic Analysis)
输入是词法分析器返回的记号流,输出是语法树。目的是得到语言结构并以树的形式表示。对于声明性语句,进行符号表的查填,对于可执行语句,检查结构合理的表达式运算是否有意义。
-
抽象语法树(Abstract Syntax Tree,AST)
抽象语法树是源代码抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构。
SQL 语句的执行环节
首先会经过分析器,进行语法分析和语义检查,得到一棵语法分析树,然后经过查询优化器得到查询计划,最后交给执行器进行执行。
graph LR
SQL语句 --> 分析器 --语法分析树--> 优化器 --查询计划--> 执行器 --> 查询结果
二、常见的查询优化器
从几个可能的计划中选择一个执行计划的过程称为优化。查询优化器负责生成 SQL 语句的有效执行计划,是关系型数据库管理系统的核心之一,决定对特定的查询使用哪些索引、哪些关联算法、从而使其高效运行。
-
Top-down Optimizer
自上而下的优化,从想要的最终结果开始,然后在树上寻找最适合的目标。
-
Bottom-up Optimizer
自下而上的优化,从零开始,然后制定计划以达到想要的最终结果。
-
Rule-based Optimizer,RBO
基于规则的优化器,规则就是人们以往的经验,或者是采用已经被证明是有效的方式。通过在优化器里面嵌入规则,来判断 SQL 查询符合哪种规则,就按照相应的规则来制定执行计划,同时采用启发式规则去掉明显不好的存取路径。
-
Cost-based Optimizer,CBO
基于代价的优化器(CBO,Cost-Based Optimizer),这里会根据代价评估模型,计算每条可能的执行计划的代价,也就是 COST,从中选择代价最小的作为执行计划。相比于 RBO 来说,CBO 对数据更敏感,因为它会利用数据表中的统计信息来做判断,针对不同的数据表,查询得到的执行计划可能是不同的,因此制定出来的执行计划也更符合数据表的实际情况。
三、查询优化器的社区开源实践
-
Apache Calcite
一款开源SQL解析工具, 可以将各种SQL语句解析成抽象语法术AST(Abstract Syntax Tree), 之后通过操作AST就可以把SQL中所要表达的算法与关系体现在具体代码之中
-
Orca
一款由微软提供的用于 Windows Installer 数据库表编辑器
-
Volcano/Cascade 框架
四、SQL 相关的前沿趋势
- 计算和存储分离
- HSAP, HTAP, HTSAP
- Cloud Native, Serverless
- 数据仓库,数据湖,湖仓一体,联邦查询
- 智能化:AI4DB,DB4AI