SQL Optimizer | 青训营笔记

105 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第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数据更快
  1. RBO 列裁剪:只列出需要的列 从project得出需要的列,往filter和join传递,这样往下的scan就只读需要的列,大大减少scan的数据
  2. RBO 谓词下推
  3. RBO 传递闭包 比如推导出一个新的filter
  4. RBO Runtime Filter

总结RBO: 优点:实现简单,优化速度快 缺点:不能保证可以得到最优的执行计划

CBO

---- 使用一个模型估算执行计划的代价,选择代价最小的执行方案

  • 通过RBO得到所有可能的等价执行计划
  • 执行计划的代价等于所有算子的执行代价之和

算子代价:包括CPU,内存,磁盘,网络I/O等

  • 和算子输入数据的统计信息有关:输入,输出的行数,每行大小

统计信息+推导规则 =》计算算子代价 =》 计算执行计划代价 =》 枚举执行代价选出最小

  1. 统计信息
  • 原始表统计信息
  • 推导统计信息:选择率和基数
  • 收集方式:在写入时数据库收集信息;手动执行explain analyze statement;动态采样
  1. 执行计划枚举
  • 通常使用贪心算法或者动态规划选出最优的执行计划

*有CDO的话,16个查询总体性能提升30%