SQL Optimizer 解析 | 青训营笔记

82 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第2天,今天主要是整理了第一堂课上的笔记,由于时间有限所以没有全部整理完,等下一次再补充完整。

SQL Optimizer 解析

大数据体系

image-20220725192727664.png

SQL

  • 一种通用语言,希望通过SQL处理所有大数据

处理流程

image-20220725193458004.png

Parser

  • string -> AST 抽象语法树
  • 词法分析
  • 语法分析

Analiyzer

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

Logical plan

image-20220725195450196.png

  • 逻辑地表述SQL对应的分布计算操作
  • 计算操作:算子(operator)

查询优化

在大数据场景下不同的查询计划会使性能差距很大,因此如何正确的执行计划是非常重要的一环。

  • 拆分后可以利用Shuffle来进行收发
  • 有点像负载均衡?把计划拆分之后,尽量避免跨节点流动,符合数据亲和性。

image-20220725200020791.png image-20220725195754910.png

小结

  • SQL是大数据的基础
  • SQL的处理流程是Parser,Analyzer,Optimizer和Executor这几个部分
  • 查询优化器是最发杂的模块,是数据库的核心组件,对于性能至关重要,选择合适的方式将事半功倍
  • 查询优化器需要感知数据分布,充分利用数据的亲和性
  • 查询优化器以最小化网络数据传输为目标将逻辑计划拆分为多个物理计划片段

常见的查询优化器

查询优化器分类

  • TOP-dow 从目标输出开始,由上往下遍历计划树找到完整的最优执行计划
  • Bottom - up 从0开始,由下往上遍历计划书
  • RBO基于规则优化
    • 根据关系代数等价语义,重写查询
    • 基于启发式规则
    • 访问表的源信息,不会涉及具体表数据
  • CBO基于代价优化
    • 使用一个模型估算执行计划代价,选择代价最小的执行计划

RBO

关系代数

image-20220725204450747.png

优化原则

  • I/O
  • 网络(传输数据更快和更少)
  • 程序数据

列裁剪

尽可能的减少数据,列裁剪之后只有需要的数据保留

image-20220725211851013.png

谓词下推

在一定条件下下推谓词来进行过滤,以减少运算次数

image-20220725212313862.png

传递闭包

通过传递闭包,将衍生出额外的筛选条件。

image-20220725215115627.png

Runtime filter

得到一些集合的特性,稀释过滤表来避免hash冲突。

image-20220725215209187.png

小结

image-20220725215759095.png

CBO

概念

本质上就是通过建立模型来估算代价来筛选执行计划。

image-20220725221423219.png

统计信息

image-20220725221720553.png

统计信息的收集方式

  • 在DDL里收集统计信息,数据库会在写入时收集或者更新统计信息
  • 手动执行指令,触发数据库收集和更新
  • 动态采样