这是我参与「第四届青训营 」笔记创作活动的的第1天。
本节课程主要分为 4 个方面:
1.大数据体系和 SQL;
2.常见的查询优化器;
3.查询优化器的社区开源实践;
4.SQL 相关的前沿趋势。
一.大数据体系和SQL
(1.)parser:
Strinf->AST
词法分析:拆分字符串,得到关键字、数值常量、字符串常量、运算符号等
语法分析:将token组成ASTnode,最终得到一个AST
(2.)SQL的处理流程:
Analyzer:
1. 检查绑定Database,Table,Column等元素
2.SQL的合法性,比如min/max的输入是否是数值
3.AST->logical Plan
Logical Plan:
1.逻辑地描述SQL对应的分布计算操作
2.计算操作:算子(operator)
Physical Plan:
1.Plan Fragment:执行计算子树 目标:最小化网络数据传输 利用上数据的物理分布(数据亲和性) 增加Shuffle算子
2.Executor: 单机并行:cache,pipeline,SIMD 多行并行:一个fragment对应多个实列
SQL的一生
二.常见的查询优化器
查询优化器的分类:
(1.)RBO(Pule-based Optimizer)
(2.)CBO(Cost-based Optimizer)
(一.)RBO(Pule-based Optimizer)
根据关系代数等价语义,重写查询 基于启发式规则 会访问表的信息元素(catalog),不会涉及具体的表数据(data)
Ⅰ.关系代数:
运算符:Select,Project,Join,Renman,Union
等价变换:结合律,交换律,传递性
Ⅱ.优化原则:
■ Read data less and faster(I/O)
■ Transfer data less and faster(Network)
■ Process data less and faster(CPU & Memory)
Ⅲ.列剪裁 Ⅳ.谓词下推 Ⅴ.传递闭包 Ⅵ.Runtime Filter
优点:实现简单,优化速度快
缺点:不保证得到最优的执行计算
(二.)CBO(Cost-based Optimizer)
概念:
○ 使用一个模型估算执行计划的代价,选择代价最小的执行计划
○ 算子代价:CPU,内存,磁盘I/O,网络I/O等代价
(1.)统计信息:
原始表统计信息:
✓ 表或者分区级别:行数、行平均数、表在磁盘中占用了多少字节等
✓ 列级别:min、max、num、nulls等 推导统计信息
✓ 选择率(selectivity):对于某一个过滤条件,查询会从表中返回多大比列的数据
✓ 基数(cardinality):在查询计划中常指算子需要处理的行数
(2.)统计信息的收集方式
1.)在DDL里指定需要收集的统计信息,数据库会在数据写入时收集或者更新统计信息
2.)手动执行explain analyze statement,触发数据库收集或者更新统计信息
3.)动态采样
(3.)统计信息推导规则
Filter Selectivity:
AND条件:fs(a AND b)= fs(a)*fs(b)
OR条件:fs(a OR b)=fs(a)+fs(b)-(fs(a)*fs(b))
执行计划枚举:
1).单表扫描:索引扫描(随机I/O) vs 全表扫描(顺序I/O)
如果查询的数据分布非常的不均衡,索引扫描可能不如全表扫描
2).Join的实现:Hash Join vs SoreMerge Jon
Ⅰ.动态规划 Ⅱ.TPC-DS
三.社区开源实践
(1.)Apache Calcite:
● One size fits all:统一的SQL查询引擎
● 模块化,插件化,稳定可靠
● 支持异构数据模型
● 内置RBO 和 CBO
(2.)Calcite RBO:
◆ 优化规则
◆ 内置100+优化规则
◆ 四种匹配规则
◆ 遍历所有的rule,知道没有rule可以被触发
◆ 优化速度快,实现简单,但是不保证最优
(3.)Calcite CBO:
◇ VolcanoPlanner:
◌ 基于Volcano/Cascade框架
◌ 成本最优假设
◌ Memo:存储候选执行计划
Group:等价计划集合
Top-down:动态规划搜索
◌ 应用Rule搜索候选计划
◌ Memo:本质:AND/OR graph 共享子树减少内存开销
◌ Group winner:目前的最优计划
◌ 剪枝(Branch-and-bound pruning):减少搜索空间
◌ Top-down 遍历:选择winner构建最优执行计划
四.前言趋势
(1.)引擎构架的进化
(2.)云原生
(3.)湖仓一体
(4.)DATA+AI
◎ AI4DB 自配置:
△ 智能调参(OtterTune,QTune)
△ 负载预测/调度 自诊断和自愈合:错误恢复和迁移 自优化
△ 统计信息估计(Learned cardinalities)
△ 代价估计 △ 学习型优化器(IBM DB2 LEO)
△ 缩影/视图推荐
◎ DB4AI:
▧ 内嵌人工智能算法(MLSQL,SQLFlow)
▧ 内嵌机器学习框架(SparkML,Alink,dl-on-flink)\