这是我参与「第四届青训营 」笔记创作活动的的第1天,今天学习了【SQL Optimizer 解析】这部分内容,重点是讲解了RBO和CBO的基本概念和实现方法。对自己比较有启发的是开头讲到的SQL的处理流程这部分内容;对RBO和CBO这部分的知识是第一次了解,训练营的老师讲解非常清楚。
SQL处理流程
- parser | 拆分字符串组成AST
- analyzer |AST->logical plan
logical plan 分步骤计算
数据结构是left-deep tree 节点右边一般是SCAN(表) - optimizer查询优化器
- executor
优化器
| RBO | CBO |
|---|---|
| 1.基于关系代数等价语义 2.基于经验的优化规则,不保证执行计划最优 | 1.使用模型评估代价 2.基于代价模型和统计信息估算代价,贪心或动态规划寻找最优执行计划 |
1RBO优化方法:
- 列裁剪
- 谓词下推
filter(sql的where下移) - 闭包传递
- Runtime Filter
2CBO优化信息:
-
原始表信息
包括行数,min,max等信息 -
推导信息
selectivity:根据过滤条件,查询从DB返回多大比例数据
cardinality:算子需要处理的行数
社区开源实战-calcite
CBO 基于Volcano/Cascade框架
Volcano/Cascade特点:动态规划、剪枝
SOTA
- 存储计算分离
- 湖仓一体
- 云原生
- AI4DB DB4AI
复习下SQL
关系代数
select 投影运算(列关系)
where 选择运算(行关系)
join
①A inner join B:取交集
②A left join B:取A全部,B没有对应的值,则为null
③A right join B:取B全部,A没有对应的值,则为null
④A full outer join B:取并集,彼此没有对应的值为null
group by having
having条件 针对的是 group by 的分组
select dept_name , avg(salary) as avg_salary
from instructor
group by dept_name
having avg(salary) > 4200