这是我参与「第四届青训营 」笔记创作活动的的第1天
1. 大数据体系和SQL
SQL 接口 处理范围广 处理流程:
- Parser string -> AST
- Analyzer string -> logical plan(无算法) 检查绑定信息;检查数据类型
left-deep tree:join保持在左侧 - 查询优化:自由度
- physical plan:执行计划子树->最小化网络数据传输
- executor:多机并行
2. 常见的查询优化器
- top-down optimizer: 由上往下
- bottom-up optimizer:由下往上
1.RBO:规则优化计算
- 本质
- 根据关系代数
- 启发式
- catalog
- 主要目标为:
- read data less and faster(I/O)
- transfer data less and faster(Network)
- process data less and faster
- 优化规则
- 列裁剪
- 谓词下推(eg.where)join之前进行筛选
- 传递闭包 等价谓词可以在其他表中优先筛选
- runtime filter
- min-max 范围紧密,特殊值影响
- inlist 集合个数过多
- bloom filter
2. CBO:模型估算代价
- 流程
- 统计信息&推导规则
- 计算算子代价(CPU 内存网络I/O)
- 总和为执行计划代价
- 执行计划枚举
- 统计信息
scan算子:包括表分区&列;
推导统计: 选择率(多少返回);基数(算子处理的行数)\
- 收集信息:
- DDL实时统计;
- 手动(信息不及时)
ANALYZE TABLE table_name COMPUTE STATISTICS FOR COLUMNS column-name1,column-name2 - 动态采样
SELECT count(*) FROM table_name
- 推导规则:选择率(概率)
- AND
- OR
- NOT
- "=":1. 不存在,为0; 2.
- "<":
- <最小,=0; 2. >最大,=1;
- 整体:\
- problem:均匀分布假设不符:①存在关联性②数据本身不均匀分布 ->直方图
- 执行计划
1.贪心算法 2.动态规划:CPU效果(执行性能高)
3. 社区开源实践
- Apache Calcite:支持expression builder
- Calcite RBO:
ad:优化规则多(A1)pattern 匹配子树,知道所有rule匹配完;
dis:经验规则,无法最优;FilterIntoJoinRule - Calcite CBO:volcanoPlanner
- memo数据结构:求解子问题的最优,利用join描述,
- 流程:AND/OR graph -> 该变条件,动态规划不断记录winner -> Top-down 遍历
- 剪枝:减少子节点计算量 —— 如果子节点得到的大于原有得到的,则无需计算父节点cost
4. 前沿趋势
- 存储计算分离(单独扩容)
- 湖仓一体:原始数据当作文件——数据湖;query查询both湖仓
- 云原生:负载动态调节,该变计算节点
- DATA + AI:
- AI4DB:
- 自配置(智能调参、负载预测)
- 自诊断和愈合
- 自优化:代价估计;IBM优化器;索引、视图推荐
- DB4AI:
- 内嵌人工智能算法(MLSQL)
- 内嵌机器学习框架(Spark)
- AI4DB:
Conclusion
- 学习了SQL数据处理的总体流程,其中主要针对查询优化中的RBO和CBO;
- RBO有4中rule,包括:列裁剪、谓词下推、传递闭包、runtime filter;
- CBO主要通过计算子节点的代价来进行动态规划,从而选择最优路径;
- 选取Calcite作为查询优化的实例,RBO含有大量Rule,CBO中运用了memo进行记录AND/OR group,同时选用剪枝减少计算量,整体采用动态规划;
- 前沿趋势包括存储计算分离等,其中与AI技术的结合可能成为查询优化的一个重要发展方向。