SQL查询优化器|青训营笔记

298 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第1天,在第一节课中主要了解到了大数据体系和SQL、常见的SQL查询优化器、社区开源实践、以及前沿趋势等内容。

一、大数据体系和SQL

  • 大数据体系中的SQL

大数据体系:

image.png

  • SQL的处理流程

image.png

Parser

  • String->AST(abstract syntax tree)
  • 实现:递归下降(ClickHouse),Flex和Bison(PostgreSQL),JavaCC(Flink),Antlr(Presto,Spark)

Analyzer

  • 检查并绑定Database,Table,Column等元信息
  • SQL的合法性检查,比如min/max/avg的输入是数值
  • AST->Logical Plan

Logical Plan

  • 逻辑地描述SQL对应的分步骤计算操作
  • 计算操作:算子(operater)

image.png

查询优化

  • SQL是一种声明式语言,用户只描述做什么,没有告诉数据库怎么做
  • 目标:找到一个正确且执行代价最小的物理执行计划
  • 查询优化器是数据库的大脑,最复杂的模块
  • 一般SQL越复杂,Join的表越多,数据量越大,查询优化的意义越大

Physical Plan

  • 目标:最小化网络数据传输
  • 利用上数据的物理分布(数据亲和性)
  • 增加Shuffle算子

Executor

  • 单机并行:cache,pipeline,SIMD
  • 多机并行:一个fragment对应多个实例

小结

  • One SQL reles big data all
  • SQL需要依次经过Parser,Analyzer,Optimizer和Executor的处理
  • 查询优化是数据库的大脑,在大数据场景下对查询性能至关重要
  • 查询优化需要感知数据分布,充分利用数据的亲和性

二、常见的查询优化器

查询优化器的分类

Top-down Optimizer

  • 从目标输出开始,由上往下遍历计划树,找到完整的最优执行计划
  • 例:Volcano/Cascade,SQLSever

Bottom-up Optimizer

  • 从零开始,由下往上遍历计划树,找到完整的执行计划
  • 例:System R,PostgreSQL,IBM DB2

RBO(Rule-based Optimizer)

  • 主流RBO实现一般都有几百条基于经验归纳得到的优化规则
  • 优点:实现简单,优化速度快
  • 缺点:不保证得到最优的执行计划

CBO(Cost-based Optimizer)

  • CBO使用代价模型和统计信息估算执行计划的代价
  • CBO使用贪心或者动态规划算法寻找最优执行计划
  • 在大数据场景下CBO对查询性能非常重要

小结

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

三、社区开源实践

社区开源实践概览

image.png

  • One size fits all
  • 模块化、插件化、稳定可靠
  • 支持异构数据模型
  • 内置RBO和CBO

Apache Calcite

Calcite RBO

- HepPlanner

  • 优化规则
  • 内置有100+优化规则
  • 四种匹配规则
  • 遍历所有的rule,直到没有rule可以被触发
  • 优化速度快,实现简单,但是不保证最优

-VolcanoPlanner

  • 基于Volcano/Cascade框架
  • 成本最优假设
  • Memo:存储候选执行计划
  • Top-down动态规划搜索
  • 应用Rule搜索候选计划
  • Group winner:目前的最优计划

小结

  • 主流的查询优化都包含RBO和CBO
  • Apache Calcite 是大数据领域很流行的查询优化器
  • Apache Calcite RBO定义了许多优化规则,使用pattern匹配子树,执行等价变换
  • Apache Calcite CBO基于Volcano/Cascade框架
  • volcano/Cascade 的精髓:Memo、动态规划、剪枝

四、前沿趋势

image.png

  • 大数据创业如火如荼,SQL查询优化仍是必不可少的一个重要组件
  • 引擎架构的进化、云原生、湖仓一体等对SQL查询优化器有新的要求和挑战
  • AI加持,学习型查询优化器在不断进化