SQL Optimizer解析 | 青训营笔记

83 阅读4分钟

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

前言:跟着老师在课程上的讲解,把知识点和老师讲解的知识做了总结和归纳,以及一些自己对于老师话语的理解都整在了笔记里。

  1. SQL的处理流程

    1. Parser

      首先通过词法分析得到关键词、数值常量、字符串常量、运算符等,然后通过语法分析,将token组成AST node,最终得到一个AST

      实现方式:递归下降,Flex,Bison,JavaCC,Antlr

    2. Analyzer和Logical Plan

      读取元数据,确保SQL的合法性,生成Logical Plan

      逻辑描述SQL对应的分布计算操作,计算操作的基本是算子

    3. 查询优化

      因为sql只是告诉做什么,没有说怎么做,而查询优化就是要找到一个正确且执行代价最小的物理执行计划

    4. Physical Plan 和 Executor

      1. Plan Fragment:执行计划子树

        image-20220725093735903.png

      ​ 正如图中所示,利用上数据的物理分布,增加shuffle算子来最小化网络数据传输

      1. Executer

        单机并行:cache,pipeline,SIMD

        多级并行:一个fragment对应多个实例

  2. 常见的查询优化器

    1. 分类:

      1. RBO

        1. 根据关系代数等价语义,重写查询

        2. 基于启发式规则

        3. 会访问表的原信息,不会具体涉及具体的表数据

        4. 优化原则:

          1. Read data less and faster(I/O)
          2. Transfer data less and faster(Network)
          3. Process data less and faster(CPU & Memory)
        5. 优化规则:

          1. 列裁剪:提前把不需要的列数过滤掉
          2. 谓词下推:尽可能先进行谓词选择,把查询的列数尽可能提前减少
          3. 传递闭包:根据表达式的等价关系与过滤条件,推导出一个新的过滤条件
          4. Runtime Filter(min - max ; in - list ; bloom filter)
        6. 优点:实现简单,优化速度快

          缺点:不保证得到最优的执行计划

      2. CBO

        1. 使用一个模型估算执行计划的代价,选择代价最小的执行计划

          1. 执行计划的代价等于所有算子的执行代价之和
          2. 通过RBO得到可能的等价执行计划
        2. 算子代价:CPU,内存,磁盘I/O,网络I/O等代价

          1. 和算子输入数据的统计信息有关:输入,输出结果的行数,每行大小...

            1. 叶子算子Scan:通过统计原始表数据得到
            2. 中间算子:根据一定的推导规则,从下层算子的统计信息推导得到
          2. 和具体的算子类型,以及算子的物理实现有关

            Snipaste_2022-07-25_11-20-43.png

          3. 统计信息

            1. 原始表统计信息
              1. 表或者分区级别:行数,行平均大小...
              2. 列级别:min、max、num nulls等
            2. 推导统计信息
              1. 选择率:对于某一个过滤条件,查询会从表中返回多大比例的数据
              2. 基数:在查询计划中常指算子需要处理的行数
          4. 统计信息的收集方式

            1. 在DDL里指定需要收集的统计信息,数据库会在数据写入时手机或者过呢更新统计信息(但是会影响数据写入数据库的速度)
            2. 手动执行explain analyze statement,触发数据库收集或者更新统计信息(但是需要手动,信息可能不是最新)
            3. 动态采样
          5. 执行计划枚举(找到最小代价)

            贪心算法

            动态规划:基于成本最优假设,通过局部的最优解得到全局的最优解

  3. 社区开源实践 - Apache Calcite

    1. 是对SQL语句进行解析优化,得到执行计划(即统一的SQL查询引擎)
    2. 支持异构数据模型: 关系型;半结构化;流式;地理空间数据
    3. 内置RBO和CBO
      1. RBO --- HepPlanner
        1. 优化规则:
          1. Pattern:匹配表达式子树
          2. 等价交换:得到新的表达式
        2. 匹配规则
          1. 深度优先
          2. TOP_DOWN
          3. BUTTOM_UP
      2. CBO --- VolcanoPlanner
        1. 基于Volcano/Cascade框架
        2. 使用TOP-DOWN 动态规划搜索
        3. 可以使用剪枝来减少搜索空间
        4. TOP-down遍历:选择winner构建最优执行计划
  4. 前沿趋势(DATA + AI)

    1. AI4DB
      1. 自配置
      2. 自诊断和自愈合
      3. 自优化
    2. DB4AI
      1. 内嵌人工智能算法
      2. 内嵌机器学习框架

随着技术的不断进步,有越来越多的新技术需要学习,就像老师预习文档里提供的论文,技术的不断革新是我们不断学习的动力。