这是我参与「第四届青训营 」笔记创作活动的第1天 《SQL Optimizer 解析》 | 青训营笔记 一:大数据体系
二:课程目录 01.大数据体系与SQL 02.常见的查询优化器(介绍其分类,重点:RBO+CBO)
03.社区开源实践(Apache Calcite) 04.SQL引擎的前沿趋势 AI和OB的结合
三:1.3:SQL的处理流程
(1)Parser:
是将输入文本转换为ast(抽象语法树),parser有包括两个部分,Parser和Lexer,其中Lexer实现词法分析,Parser实现语法分析。
(词法分析后将token组成AST node 最终得到一个AST)
AST:
是Abstract Syntax Tree的缩写,也就是抽象语法树。AST是parser输出的结果。这也是语法树的精髓了,sql解析,本质上就是把sql转为 ast语法树,拿到这个语法树后,我们就能做很多事了,遍历也好,加点,修改也好,都可以在ast上完成。
(2)Analyzer和Logical Plan
Analyzer:绑定一些元信息例如:Database,Table,Column等信息
检查SQL的合法性,例如数值的正确性
将AST转化为Logical Plan
Logical Plan:逻辑地描述SQL对应的分步骤计算操作
计算操作:算子(operator)
(3)查询优化:找到一个正确且执行代价最小的物理执行计划
查询优化器是数据库的大脑
其将最小化网络数据传输的目标把逻辑拆分成多个物理计划片段
(4)Physical Plan和Executor
Physical Plan:执行计划子树:最小化网络数据传输
利用数据的物理分布(数据亲和性)
增加Shuffle算子
Executor:单机并行:cache,pipeline,SIMD
多机并行:一个fragment对应多个实例
2.1:查询优化器分类
Top-down Optimizer
Bottom-up Optimizer
Rule-base Optimizer(RBO):基于关系代数的等价变换
Cost-based Optimizer(CBO)
RBO:
基于规则的优化,比如谓词下推,列裁剪,常量折叠。
a.常量折叠案例:
select 1+1 as id from table1
会优化为(会提前将 1+1 计算折叠成 2,再赋给 id 列的每行,不用每行都计算一次 1+1)
select 2 as id from table1
b.谓词下推案例:
select * from table1 a join table2 b on a.id=b.id where a.age>20 and b.cid=1
会优化为(在子查询阶段就提前将数据进行过滤,后期 join 的 shuffle 数据量就大大减少)
select * from ( select * from table1 where age>20) ajoin (select * from table2 where cid=1) b on a.id=b.id
c.列裁剪案例:
select a.name, a.age,b.c id from (select * from table1 where a.age>20) ajoin (select * from table2 where b.cid=1) b on a.id=b.id
会优化为(提前将需要的列查询出来,其他不需要的列裁剪掉)
select a.name, a.age, b.cidfrom (select name,age,id from table1 where a.age>20) ajoin (select id,cid from table2 where b.cid=1) b on a.id=b.id
d.传递闭包
e.Runtime Filter
CBO:
基于代价的优化,多种物理计划基于cost model,选取最优的执行耗时最少的那个物理计划。
CBO的统计信息
CBO-统计信息的收集方式(实际中都会用到、各有优缺点)
·在DDL里指定需要收集的统计信息,数据库会在数据写入的时候收集或者更新统计信息
·手动执行explain analyze statement,触发数据库收集或者更新统计信息
·动态采样
2.3.1——CBO-统计信息推导规则
·Filter Selectivity:and、or、not条件、等于、小于条件。。。
2.3.2——CBO-执行计划枚举
·单表扫描-join的实现-两表Hash join-多表join
·贪心算法/动态规划选出最优的执行计划
·动态规划:找最优解
CBO效果-TPC-DS