前景
多个大数据计算引擎都支持 SQL 作为更高抽象层次的计算入口,查询优化器是数据库系统必备组件,对于 SQL 作业的执行性能起着至关重要的作用。
SQL处理流程分为四个组件
总流程:parser把SQL变成AST输出,然后经过Analyzer输出一个logical plan,然后经过一个优化器处理输出一个物理计划,最后交给executor执行,然后处理数据返回数据给用户。
- parser
组件作用:string->AST(abstract syntax tree)
词法分析:拆分字符串,得到关键字、数值常量、字符串常量、运算符号等token。
语法分析:将token组成AST node,最终得到一个AST。 实现:递归下降,Flex和Bison,JavaCC(Flink),Antlr(Presto,Spark)
- Analyzer
组件作用:检查并绑定Database,Table,Column等元信息
SQL的合法性检查,比如min/max/avg的输入是数值 AST->Logical Plan
- logical plan
组件作用:逻辑地描述SQL对应的分步骤计算操作。
计算操作:算子(operator)
- physical plan 和Executor
plan fragment:执行计划子树
目标:最小化网络数据传输
利用上数据的物理分布(数据亲和力)
增加shuffle算子
executor
单行并行:cache,pipeline,SIMD
多行并行:一个fragment对应多个实例
查询优化
SQL是一种声明式语言,用户只描述做什么,没有告诉数据库怎么做。
目标:找到一个正确且执行代价最小的物理执行计划 查询优化器是数据库的大脑,最复杂的模块,很多相关问题都是NP的。
一般SQL越复杂,join的表越多,数据量越大,查询优化的意义就越大,因为不同的执行方式的性能差别可能有成百上千倍。
总结
SQL需要依次经过Parser,Analyzer,Optimizer和Executor的处理。
查询优化器是数据库的大脑,在大数据场景下对查询性能至关重要。
查询优化器需要感知数据分布,充分利用数据的亲和性 查询优化器按照最小化数据传输的目标把逻辑计划拆分成多个物理计划片段。
这里只是介绍了SQL的四个组件是相关于SQL内容中的小小部分,并不能作为SQL的全部去学习。
通过这节课学习也掌握了很多相关于SQL的很多细小知识,收获还是颇多的。