# SQL Optimizer解析01|青训营笔记

154 阅读2分钟

这是我参与【第四届青训营】笔记创作活动的第一天

大数据体系(分层式:由底层到高层)

  • 基础设施
  • 储存系统
  • 资源调度
  • 分析引擎 (批量分析|实时分析|交互分析)
  • 权限管控
  • 数据开发
  • 业务应用 (BI报表|数据挖掘|营销分析|精准推荐)

用SQL处理所有的大数据:One SQL rules big data all


SQL处理数据流程

graph TD
SQL --> Parser --> AST --> Analyzer --> logicalPlan --> Optimizer -->physicalplan --> Executor

SQL-->Parser

In:String->Out:AST(抽象语法树)(通过词法分析和语法分析)通过递归下降实现


Analyzer
  • 检查元信息是否存在并且合法,然后绑定
  • 检查SQL是否合法
  • AST 抽象语法树转换成Logical Plan
Logical Plan
  • 逻辑地描述SQL对应的分步骤计算操作
  • 计算操作,里面有算子(oprator)
left-deep tree join右边的这个child必须是一个表

查询优化Optimizer

用户只在数据库中描述了得到什么样的结果,通过查询优化器来找到最优的解法

目标:找到一个正确且执行代价最小的计划

查询优化器是数据库的大脑,同时一般SQL越复杂查询优化器的意义越大!

Plan Fragment:执行计划子树

目标:最小化网络传输,利用数据上物理的分布(数据亲和性),读取信息时尽量读取本地的信息,不要读取远程的,远程的数据涉及网络开销,节点中的连接通过增加shuffle算子,一边发送一边接收。

把执行计划拆分成很多个plan fragment利用executor这个节点连接

Executor

  • 单机并行
  • 多机并行:一个fragment对应多个实例(比如说F1这个实例可以被node1和2读取,node1和2读取的都是同一张表但是读取的内容不一样;node1读取的内容最好不要通过其他node发送,会增加网络开销)

总结

  • 希望用SQL处理所有大数据
  • SQL依次通过Parser、Analyzer、Optimizer和Executor处理
  • 查询优化器是数据库的大脑,在大数据中特别重要,找到的最优解可能是其他方法的千万倍
  • 查询优化器需要感知数据分布,充分利用数据亲和性(本地数据最优,远程数据涉及网络开销)
  • 查询优化器按照最小化网络数据传输的目标把逻辑计划拆分成多个物理计划片断