这是我参与 ⌈第四届青训营⌋ 笔记创作活动的第1天
查询优化器
SQL分析和执⾏的优化⼯具,负责⽣成、制定SQL的执⾏计划
- RBO:Rule-Based Optimization 基于规则的优化器
RBO是根据可用的访问路径以及访问路径等级来选择执行计划,在RBO中,SQL的写法往往会影响执行计划
- 根据关系代数等价语义,重写查询
- 基于启发式规则
- 会访问表的元信息(catalog),不会涉及具体的表数据(data)
- CBO:Cost-Based Optimization 基于代价的优化器
CBO优化器根据SQL语句⽣成⼀组可能被使⽤的执⾏计划,估算出每个执⾏计划的代价,并调⽤计划⽣成器(Plan Generator)⽣成执⾏计划,⽐较执⾏计划的代价,最终选择选择⼀个代价最⼩的执⾏计划
对比
主流RBO实现一般都有几百条基于经验归纳得到的优化规则 优点:实现简单,优化速度快 缺点:不保证得到最优的执行计划
CBO使用代价模型和统计信息估算执行计划的代价, 使用贪心或者动态规划算法寻找最优执行计划
所以CBO是一种比RBO更加合理、可靠的优化器,大数据场景下CBO对查询性能非常重要。
Apache Calcite
⼀款开源SQL解析⼯具, 可以将各种SQL语句解析成抽象语法术AST(Abstract Syntax Tree), 之后通过操作AST就可以把SQL中所要表达的算法与关系体现在具体代码之中。 calcite提供标准的SQL语言和多种查询优化
解析SQL
-
Calcite通过Java CC将SQL解析成未经校验的AST(抽象语法树)
-
校证Parser步骤中的AST是否合法,通过优化器生成RelNode tree(关系表达式树)
-
优化RelNode tree, 并将其转化成物理执⾏计划。
-
将物理执⾏计划转化成可在特定的平台执⾏的程序。
Volcano Planner
基于Cascades模型的自顶向下的查询优化器
- 应用 Rule搜索候选计划
- Top-down遍历: 选择winner构建最优执行计划
- Volcano/Cascade的精髓: Memo、动态规划、剪枝
SQL总结
个人感受
知识点繁杂,延伸性,拓展性都很大,粗学一遍只能说对SQL优化有了浅显的认知和理解,还需努力。