这是我参与「第四届青训营」笔记创作活动的的第1天
大数据体系
SQL体现在分析引擎中,分别有批式分析(Spark、hive)、实时分析(flink)、交互分析(Presto、ClickHouse)
SQL处理流程
Parser
- 抽象语法树AST(abstract syntax tree)
- 词法分析:拆分字符串,得到数值常量、字符串常量等token
- 语法分析:将token组成AST node,得到一个AST
- 实现:递归下降(ClickHouse),Flex和Bison(PostgreSQL)等
Analyzer
- 检查并绑定Database,table等元信息
- SQL的合法性检查
- AST转化成Logical Plan
- LP:描述SQL分步骤计算操作,即算子
Optimizer
physical plan: 执行计划子树Plan Fragment,目标是最小化网络数据传输,增加Shuffle算子
Executor
单机并行:cache,pipeline,SIMD 多机并行:一个fragment对应多个实例
查询优化器
top-down Optimizer
由上往下遍历计划树,找到完整的最优执行计划
bottom-up Optimizer
由下往上遍历计划树
RBO
实现一般有几百条基于经验归纳得到的优化原则,实践简单,优化速度快,但不保证得到最优的执行计划
关系代数
运算符 等价变换
优化原则
读取数据更少更快 IO 转换数据更少更快 网络 处理数据更少更快 CPU、内存 列裁剪:select,on部分 谓词下推:where 部分 传递闭包: Runtime Filter:
CBO
代价模型使用一个模型估算执行计划的代价,选择代价最小的执行计划
统计信息
原始表:表或者分区级别、列级别 推导统计信息: 选择率:对某个过滤条件,查询会返回多大比例的数据 基数:在查询计划中常指算子需要处理的行数(其准确率很重要)
枚举策略
- 通常用贪心算法或动态规划选出最优的执行计划(局部最优解推全局最优解)
- 单表扫描:索引扫描(随机I/O),全表扫描(顺序I/O),如果查询的数据不均衡,索引扫描不如全表扫描
- 开启CBO的优点:减少了90%的Shuffle数据量;效 率更高
开源社区实践——Apache Calcite
- 主流的查询优化器都包含RBO和CBO
- Calcite是大数据领域流行的查询优化器,
- 其RBO定义了许多优化规则,pattern匹配子树,执行等价变换
- 其CBO基于Volcano/Cascade框架,其特点是:Memo、动态规划、剪纸
前沿
- 引擎架构的进化
- Cloud 云原生、云中立
- 湖仓一体 Query Federation
- DATA + AI AI4DB 自配置,自诊断,自愈合,自优化 DB4AI 内嵌人工智能算法(MLSQL,SQLFlow) 内嵌机器学习算法(SparkML,Alink,dl-on-flink)