SQL查询优化器浅析 | 青训营笔记
这是我参与「第四届青训营 」笔记创作活动的的第1天
大数据体系图
1.大数据体系和SQL
1.1 大数据体系-One SQL rules big data all
SQL在分析引擎中占有很重要的地位
1.2 SQL的处理流程
1.2.1 Parser
String->AST(abstract syntax tree)
- 词法分析:拆分字符串,得到关键词、数值常量、字符串常量、运算符号等token
- #语法分析:将token组成AST node,最终得到一个AST 实现:递归下降(ClickHouse),Flex和Bison(PostgreSQL),JavaCC(Flink),Antlr(Presto,Spark)
1.2.2 Analyzer和Logical Plan
Analyzer
- 检查并把规定Database,Table,Column等元信息
- SQL的合法性检查,比如min/max/avg的输入必须要是数值
- AST->Logical Plan Logical Plan
- 逻辑地描述SQL对应的分步骤计算操作
- 计算操作:算子(operator)
1.2.3 查询优化
- SQL是一种声明式语言,用户只描述做什么,没有告诉数据库怎么做
- 目标:找到一个正确切执行代价最小的物理执行计划
- 查询优化器是数据库的大脑,最复杂地模块,很多相关问题都是NP的
- 一般SQL越复杂,Join的表越多,数据量越大,查询优化的意义就越大,因为不同执行方式的性能差别可能有成百上千倍数
1.2.4 Physical Plan 和 Executor
Plan Fragment:执行计划子树
- 目标:最小化网络数据传输
- 利用上数据的物理分布(数据亲和性)
- 增加Shuffle算子 Executor
- 单机并行:cache,pipeline,SIMD
- 多机并行:一个fragment对应多个实例
1. 小结
- One SQL rules big data all
- SQL需要依次经过Parser,Analyzer,Optimizer和 Executor的处理
- 查询优化器是数据库的大脑,在大数据场景下对查询性能至关重要
- 查询优化器需要感知数据分布,充分利用数据的亲和性
- 查询优化器按照最小化网络数据传输的目标把逻辑计划拆分成多个物理计划片段
2.常见的查询优化器
2.1查询优化器分类
2.2 RBO
2.2.1 RBO-关系代数
2.2.2 RBO-优化原则
2.2.3 RBO-列裁剪
2.2.4 RBO-谓词下推
2.2.5 RBO-传递闭包
利用传递性
2.2.5 RBO-Runtime Filter
- min-max 适合较为集中的数据
- in-list 适合分数的数据
- bloomfilter 一一对应,效率高
2.2 RBO小结
缺点:选择执行计划的方式比较死板
2.3 CBO-概念
2.3.1 CBO-统计信息
信息收集方式(3种)
统计信息推导规则
统计信息推导存在的问题
2.3.2 CBO-执行计划枚举
动态规划
先找出子问题最优,进而推断出整体最优
CBO效果-TPC-DS Q25
关闭开启对比