SQL 查询优化器浅析|字节跳动青训营

141 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第2天


本节课程主要通过 4 个方面来讲解SQL 查询优化器:

  1. 大数据体系和 SQL;
  2. 常见的查询优化器;
  3. 查询优化器的社区开源实践;
  4. SQL 相关的前沿趋势。

大数据体系

课程目录:

  1. 大数据体系和SQL
  2. 常见的优化查询器
  3. 社区开源实践
  4. 前沿趋势

\

大数据体系和SQL

大数据体系:

SQL处理流程

  • String->AST(abstract tree)
    • 词法分析:拆分字符串,得到关键字,数字常量,运算符合等token
    • 语法分析:讲token组成AST node,最终得到一个AST
  • 实现:递归下降

SQL的处理流程:

  • Analyzer
    • 检查并绑定Database,table,Column等信息
    • SQL的合法性检查,比如min/max/avg的输入是数值
    • AST->Logical Plan
  • Logical Plan
    • 逻辑的描述SQL对应的分步骤计算操作
    • 计算操作:算子(operator)
  • 查询优化
    • SQL是一种描述性语言,用户只描述做什么,没告诉数据库怎么做
    • 目标:找到一个正确且执行代价最小的物理执行计划
    • 查询优化器是数据库的大脑,最复杂的模块,很多相关问题都是NP的
    • 一般SQL越复杂,Join表越多,查询优化的意义就越大
  • Physical Plan和Executor
    • Plan Fragment:执行计划子树
      • 目标:最小化网络数据传输
      • 利用上数据的物理分布(数据亲和性)
      • 增加Shuffle算子
  • Executor
    • 单机并行:cache,pipeline,SIMD
    • 多机并行:一个fragment对应 多个实例

小结

  • One SQL rules big data all
  • SQL需要依次经过Parser,Analyzer,Optimizer和Executor
  • 查询优化器的数据库的大脑,在大数据场景下对查询性能至关重要
  • 查询优化器需要感知数据分布,充分利用大数据的亲和性
  • 查询优化器按照最小化网络数据传输的目标把逻辑计划拆分成多个物理计划片段

常见的优化查询器

  • RBO(Rule-based Optimizer)
    • 主流RBO实现一般都有几百条基于经验归纳得到的优化规则
    • 优点:实现简单,优化速度快
    • 缺点:不保证得到最优的执行计划
  • CBO(Cost-based Optimizer)
    • 概念:使用一个模型估算执行计划的代价,选择代价最小的执行计划
      • 执行计划的代价等于所有算子的执行代价之和
      • 通过RBO得到所有可能的等价执行计划
    • CBO小结
      • CBO使用代价模型和统计信息估算执行计划的代价
      • CBO使用贪心或者动态规划算法寻找最优执行计划
      • 在大数据常见下CBO对查询性能非常重要

小结

  • 主流RBO实现一般都有几百条基于经验归纳得到的优化规则
  • RBO实现简单,优化速度快
  • RBO不保证得到最优的执行计划
  • CBO使用代价模型和统计信息估算执行计划的代价
  • CBO使用谈心算法或者动态规划算法寻找最优执行计划
  • 大数据场景下CBO对查询性能非常重要