这是我参与「第四届青训营 」笔记创作活动的的第1天
Part 1
SQL 处理流程: Parser =》 Analyzer =》 Optimizer =》 Executor
String -> abstract syntax tree:
- 词法分析:由拆分字符串来得到关键词/数值常量/运算符号等信息
- 语法分析:把token组成AST node,最终得到一个AST
Analyzer:
- 检查并绑定元信息
- 检查,比如看min的输入是否是数值
*一般越复杂,join的表越多,查询优化的意义就越大
Plan Fragment:为了最小化节点间的数据传输,利用数据的物理分布
Part 2
查询优化器分类: Top-down Optimizer : 从目标输出开始,从上往下遍历 Bottom-uup Optimizer : 从零开始,从下往上
RBO
优化原则:
- 读数据更快
- transfer数据更快
- process数据更快
- RBO 列裁剪:只列出需要的列 从project得出需要的列,往filter和join传递,这样往下的scan就只读需要的列,大大减少scan的数据
- RBO 谓词下推
- RBO 传递闭包 比如推导出一个新的filter
- RBO Runtime Filter
总结RBO: 优点:实现简单,优化速度快 缺点:不能保证可以得到最优的执行计划
CBO
---- 使用一个模型估算执行计划的代价,选择代价最小的执行方案
- 通过RBO得到所有可能的等价执行计划
- 执行计划的代价等于所有算子的执行代价之和
算子代价:包括CPU,内存,磁盘,网络I/O等
- 和算子输入数据的统计信息有关:输入,输出的行数,每行大小
统计信息+推导规则 =》计算算子代价 =》 计算执行计划代价 =》 枚举执行代价选出最小
- 统计信息
- 原始表统计信息
- 推导统计信息:选择率和基数
- 收集方式:在写入时数据库收集信息;手动执行explain analyze statement;动态采样
- 执行计划枚举
- 通常使用贪心算法或者动态规划选出最优的执行计划
*有CDO的话,16个查询总体性能提升30%