这是我参与「第四届青训营 」笔记创作活动的第1天
SQL查询优化器思维导图
课程目录
- 大数据体系和SQL
- 常见的查询优化器
- 社区开源实践
- 前沿趋势
1.1 SQL分析引擎
1.2 SQL的处理流程
parser(SQL解析器)
- 词法分析:拆分字符串,得到关键词、数值常量、字符串常量,运算符等token
- 语法分析:将一些列token组成一个AST
Analyzer
- 检查SQL的合法性:如min、max的输入是数值
- AST——>Logical Plan
Logical Plan:逻辑地描述SQL对应的分步骤计算操作
计算操作:算子(如:Join,Scan)
Optimizer
- 目标:正确且执行代价最小的物理执行计划
- SQL越复杂,Join的表越多,数据量越大查询优化的意义越大
Executor
- 目标:最小化的网络数据传输
- 分布式:最好本地读取数据(利用数据亲和性)
2.1 常见的查询优化器
- Top-down Optimizer
- 从上往下遍历计划树,找到完整的最优执行计划
- Bottom-up Optimizer
- 从下往上遍历计划树,找到完整的执行计划
- RBO
- 根据关系代数等价语义(交换律,结合律,传递性),重写查询。
- 会访问表的元信息,不会涉及具体表数据。
- CBO
- 使用一个模型估算执行计划的代价,选择代价最小的执行计划
2.2 RBO:基于规则的优化
- 列裁剪:select要的列,即去掉不需要查找的列
- 谓词下推:where里面的表达式即称为谓词,可以减少计算的开销(提前过滤)
- 传递闭包:可以从join的连接条件和where的过滤条件推导出新的过滤条件,可以进行谓词下推
- Runtime Filter:min-max filter,in-list filter,bloom filter
min-max filter:[min,max]——数据的大小范围
- 缺点:范围需要很紧密
- 如范围1-100w,然后大部分都是1-100,小部分是100-100w,这样过滤效果不是很好
in-list filter:如果join右边的值很少,就可以用一个list来标识过滤条件
- 缺点:右边集合的个数过多,若有100w个,把100w传输给左边的join,其中的IO也不可忽视
bloom filter:大小不随集合大小改变,固定大小
- 给其一个数,能判断是否在集合中,如果判断其不在,则不在;如果判断其在,则可能在。构建hash表的时候也会构建一个bloom filter。然后传给join的左边,再去扫描表
优点:实现简单,优化速度快
缺点: 不能保证最优执行计划
2.3 CBO:基于代价的优化
- 使用模型估计执行计划的代价,选其最小
- 通常使用动态规划或者贪心算法,选择最优的执行计划
2.3.1 统计信息
原始表统计信息
- 表或者分区级别:行数、行平均大小、表在磁盘中占用了多少字节等
- 列级别:min、max、num nulls、num、not nulls、num、distinct value(NDV)、histogram 等
推导统计信息
- 选择率(selectivity) :对于某一个过滤条件,查询会从表中返回多大比例的数据(返回数据的比例)
- 基数(cardinality) :基本含义是表的 unique 行数,在查询计划中常指算子需要处理的行数
统计信息收集方式:
- DDL
- 写入数据库时,实时收集统计信息
- 缺点:更新数据会变慢
- 手动执行
- 手动触发需要收集的字段
- 如:Analyze table table_name Compute Statistics For columns col1,col2···
- 缺点:不够及时,数据容易过时(旧)
- 动态采样
- select count(*) from table_name
- 选择表的某些数据来估算整张表的数据,可以统计表的行数,如count(*)计算出行数
3 社区开源实践
3.1 Apache Calcite:流行的查询优化器
- 统一的SQL查询引擎,可对SQL进行解析,可以对接不同的数据处理系统(hive、flink等)
- 模块化、插件化、稳定可靠
- 支持异构数据模型
- 内置 RBO 和 CBO
3.2 RBO:HepPlanner
优化规则:
- pattern :匹配表达式子树
- 等价变换:得到新的表达式
优化规则:遍历匹配表达式子树,通过等价变换得到新的表达式,遍历完即任务优化结束
优化速度快,实现简单,但是不保证最优
3.3 CBO:VolcanoPlanner
- 基于Volcano/Cascade框架
- 成本最优假设
- Memo:存候选执行计划
- 剪枝:减少搜索空间
- 会top-down遍历:选择最优执行计划
4 前沿趋势
前沿趋势-概览
DATA + AI:主要分为AI4DB or DB4AI 2种
总结与思考: 听了SQL查询优化器浅析课程,我对大数据以及SQL有了更深一层的认识,以及认识到了查询优化器对于大数据场景的重要性,对于RBO,CBO都有各自的优缺点,一般情况下两者也都会用到。特别是对于Apache Calcite,让我更清晰地了解了SQL查询优化器的原理,如基于Volcano/Cascade框架的CBO,其精髓在与Memo、动态规划还有剪枝,可以用于减少搜索空间,这些都是为了提高优化的性能。