SQL查询优化器 | 青训营笔记

71 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第1天,今天学习了【SQL Optimizer 解析】这部分内容,重点是讲解了RBO和CBO的基本概念和实现方法。对自己比较有启发的是开头讲到的SQL的处理流程这部分内容;对RBO和CBO这部分的知识是第一次了解,训练营的老师讲解非常清楚。

SQL处理流程

  1. parser | 拆分字符串组成AST
  2. analyzer |AST->logical plan
    logical plan 分步骤计算
    数据结构是left-deep tree 节点右边一般是SCAN(表)
  3. optimizer查询优化器
  4. executor

优化器

RBOCBO
1.基于关系代数等价语义
2.基于经验的优化规则,不保证执行计划最优
1.使用模型评估代价
2.基于代价模型和统计信息估算代价,贪心或动态规划寻找最优执行计划

1RBO优化方法:

  1. 列裁剪
  2. 谓词下推
    filter(sql的where下移)
  3. 闭包传递
  4. Runtime Filter

2CBO优化信息:

  1. 原始表信息
    包括行数,min,max等信息

  2. 推导信息
    selectivity:根据过滤条件,查询从DB返回多大比例数据
    cardinality:算子需要处理的行数

社区开源实战-calcite

CBO 基于Volcano/Cascade框架
Volcano/Cascade特点:动态规划、剪枝

SOTA

  1. 存储计算分离
  2. 湖仓一体
  3. 云原生
  4. 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

参考

SQL-join