SQL Optimizer解析| 青训营笔记

84 阅读4分钟

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

  • 为什么要先讲SQL

    • sql相对于其他编程语言操作较简单
    • sql是很多系统都支持的接口,是事实的接口
    • 希望通过sql去处理所有的大数据
  • sql处理流程

    • 四个阶段:Parser、Analyzer、Optimizer、Executor
    • Parser:输入字符串,输出是一个AST(抽象语法树),

      • 需要运用到词法分析(得到token)、语法分析(把token组成AST node)
      • 实现:递归实现(clickhouse)、Flex(词法分析)和Bison(语法分析)、JavaCC、Antlr
      • 比如将一段查询语句拆分为一棵树,以select为根节点,向下分成selectlist、from等信息
    • Analyzer:输入AST(抽象语法树),输出是一个Logical Plan(逻辑计划,用算子进行计算)

      • 作用:检查并绑定元信息、SQL的合法检查、将AST转化为Logical Plan
    • 查询优化(很重要):找到一个正确且代价最小的物理执行计划

      • 为什么最难:1.因为复杂,往往相关问题是np的;2.join的表多,数据量大;3.需要去找合适的方法
      • 需要充分利用数据的亲和性
      • 按照最小化网络数据传输的目标将逻辑计划拆分为多个物理块
    • Executor:将正确且代价最小的物理执行计划转化为执行计划

      • 可分为单机并行、多机并行
  • 常见的查询优化器分类

    • 按照遍历树顺序分:

      • Top-down Optimizer:从目标出发,由下往上遍历找最优

        • eg:Volcano、SQLserver
      • Top-down Optimizer:从零出发,由上往下遍历找最优

        • eg:System R 、PostgreSQL、IBM、DB2
    • 按照优化方法分

      • RBO:基于启发式规则;根据关系代数等价语义(结合律、交换律、传递性),重写查询;会访问表的元信息,不涉及具体数据

        • 优化原则

          • 列裁剪:尽早把一些列去掉,减少io的占用,依次向下传递所需信息
          • 谓词下推:谓词尽可能的往下推,但是下推是有条件的
          • 传递闭包:根据表达式和等价关系,继续产生新的filter
          • runtime filter:运行时才能实现,运行时产生的数据的到一些集合的特性传递给其它filter(可用min-max、in-list、bloom filter)
      • CBO:使用模型估计代价,选择代价最小的执行计划,对查询性能重要

        • 算子代价:CPU、内存、磁盘I/O、网络I/O等代价

          • 和算子输入信息的统计信息、算子类型、物理实现有关
        • 实现过程

          • 统计信息

            • 原始表统计:表或者分区级别、列级别
            • 推导统计信息

              • 选择率:设置查询条件后,查询会从表中返回多大比例的数
              • 基数:查询计划中常指算子需要处理的行数(很重要)
            • 统计信息收集方式

              • 在DDL中指定需要收集的统计信息
              • 手动执行
              • 动态采样\
            • 统计信息推到规则

              • 前提:列与列独立,列的值均匀(与实际不相符)
              • 用户指定相关联的列,不是均与分布的情况可以用直方图处理
              • AND、OR、NOT、等于、小于条件
          • 执行计划枚举

            • 通常使用贪心算法或者动态规划
  • 社区开源实践

    • Apache Calcite:模块化,插件化,可靠

      • 支持异构数据模型(关系型、半结构化、流式、地理空间数据)
      • 内置RBO和CBO

        • Calcite CBO

          • ValcanoPlanner

            • 基于Valcano/Cascade框架
            • 成本最优假设
            • Memo:存储候选执行计划,本质是AND/OR graph
            • Group:等价计划集合
            • Group winner:目前最优计划
            • Top-down:动态规划搜索,先择winner构建最优执行计划
            • 精髓:剪枝:减少搜索空间
        • Calcite RBO

          • HepPlanner

            • 可通过Pattern、等价变换优化规则
            • 内置100+优化规则
            • 四种匹配规则:ARBITRARY/DEPTH_FIRST、Top-down、Top-down
            • 遍历所有的规则
            • 速度快、简单、不一定最优
  • 前沿趋势\

    • 存储计算分离、一体化
    • 云原生、serverless
    • 湖仓一体
    • DATA+AI

      • AI4DB

        • 自配置
        • 自诊断和自愈合
        • 自由化
      • DB4AI\

        • 内嵌人工智能算法
        • 内嵌机器学习框架
  • 补充信息:

    • Logical Plan:逻辑地描述SQL对应的分步骤计算操作,即在SQL上的实现代码,说明了步骤,但是没说用什么方法
    • left-deep tree:右边必须是表scan
    • Physical Plan(执行计划):

      • Plan Fragment(执行计划子树):执行计划的一部分,最小化网络数据传输,不同Plan Fragment通过Shuffle算子连接

总结:

-这是我在字节青训营的第一节课,做到认真的去听讲,但是由于自己的基础问题,发现对于一些基础性的知识概念还是比较的不清晰,希望在接下来的过程中能够和大家一起进步,一步一步成长。