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

58 阅读2分钟

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

大数据体系和SQL

为什么先讲SQL优化器

  1. 非常流行、简单
  2. 很多系统都支持的接口
  3. 大数据处理的一个实时的接口

One SQL rules big data all

SQL 的处理流程

Parser --> Analyzer --> Optimizer --> Executor

Parser

  • 输入:String 或者文本
  • 输出:AST(abstract syntax tree)抽象语法树
  • 步骤:词法分析、语法分析
  • 实现:递归下降(ClickHouse), Flex(词法分析)和Bison(语法分析)(PostgreSQL),JavaCC(Flink),Antlr(Presto,Spark)

Analyzer

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

Logical Plan

  • 顾名思义:逻辑地描述SQL对应的分步骤计算操作
  • 计算操作:算子(operator)

Optimizer

  • 为什么叫查询优化:SQL是一种声明示语言,用户只描述做什么,没有告诉数据怎么做
  • 目标:找到一个正确且执行代价最小的物理执行计划
  • 查询优化器是数据库的大脑,最复杂的模块(哈人)很多相关问题都是NP的
  • 一般SQL越复杂,Join的表越多,数据量越大,查询优化的意义就越大,因为不同执行方式的性能差别可能有成千上百倍

Physical Plan

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

Executor

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

常见的查询优化器

查询优化器分类

  • 按照遍历树的顺序来划分
    • Top-down Optimizer
    • Bottom-up Optimizer
  • 按照优化方法划分
    • Rule-based Optimizer(RBO)(基于规则
    • Cost-based Optimizer(CBO)(基于代价

RBO

  • 优化原则:I/O、Network、CPU & Memory
  • 列裁剪
  • 谓词下推
  • 传递闭包
  • Runtime Filter

越来越好、越来越难

  • 优点:实现简单,优化速度快
  • 缺点:不保证得到最优的执行计划靠经验

CBO

  • 概念:使用一个模型估算执行计划的代价,选择代价最小的执行计划
  • 执行流程:统计信息 + 推导规则 --> 计算算子代价 --> 计算执行计划代价 --> 执行计划效率
  • 统计信息:推导统计信息 选择率、基数(准确的基数cardinality很重要
  • 统计信息收集方式
    • 在DDL里指定
    • 手动执行explain analyze statement
    • 动态采样
  • 执行计划枚举:贪心算法、动态规划寻找最优执行计划

CBO对查询性能非常重要

以上总体按照上课顺序整理,个人对RBO的几个优化方法的例子没太看懂……通过本次课大概对SQL的流程有了一个总体的认识,了解了一些查询优化器,期待在未来自己去运用。