SQL Optimizer 解析 | 青训营笔记

79 阅读5分钟

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

一.大数据

  1. 什么是大数据

    顾名思义,指的是大量的数据,这些数据通常是传统数据处理软件无法处理的

  2. 大数据的特征

    • 大量(Volume):大数据的量很大,数据量通常可达数十TB甚至数百PB(PB = 1024TB)
    • 高速(Velocity):大数据被实时的写入内存,同时基于数据实时评估而进行操作
    • 多样化(Variety):数据类型不一,无法被整齐的写入关系型数据库中
    • 价值(Value):将原始数据经过分析得到较高的商业价值

二.大数据体系

大数据的核心模块

  1. 存储系统:
    • HDFS:Hadoop分布式文件系统
    • HBase:基于Hadoop实现的分布式非关系型数据库
    • NAS:网络附属存储,一种专用数据存储服务器
    • Object Store:将数据作为对象进行管理的计算机数据存储体系结构
    • 数据湖:存储所有的数据
  2. 分析引擎:
    • 批式分析:Spark,Hive,MR
    • 实时分析:Flink
    • 交互分析:Presto,ClickHouse,Doris
  3. 消息队列:解耦存储和计算,常用Kafka

三.大数据体系和SQL

  1. sql成为了大数据分析引擎的接口:one sql rules big data all

  2. sql的处理流程

    1. Parser:SQl > AST

      将sql语句解析成为语法分析树

      具体实现:递归下降,Flex和Bison,JavaCC,Antlr

    2. Analyzer:AST > Logical Plan

      • Analyzer:检测SQL合法性

      • Logical Plan:描述SQL执行步骤

    3. 查询优化

      • SQL是一种声明式的语言,用户只描述做什么,没有描述怎么做

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

      • 应用场景:SQL语句越复杂,Join表越多,数据量越大,查询优化意义越大

    4. Physical Plan 和 Executor

      • Plan Fragment:执行计划子树

        目的:最小化网络数据传输

        增加shuffle算子:计算和传输

      • Executor

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

  3. 小结:查询优化器是数据库的大脑,以按照最小化网络传输的目标去执行SQL语句

四.常见的查询优化器

  1. 查询优化器分类

    • Top-down Optimizer

      从上往下遍历计划树,eg:Volcano/Cascade,SQLServer

    • Bottom-up Optimizer

      从下往上遍历计划树,eg:PostgreSQL

    • Rule-Base Optimizer (RBO)

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

      访问表的元信息,不涉及具体数据

    • Cost-Base Opyimizer(CBO)

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

  2. RBO-关系代数

    • 运算符:Select,Project,Join,Rename,Union

    • 等价交换:结合律,交换律,传递性

    • 优化方向:I/O,network,cpu&memory

    • 优化规则

      • 列裁剪:将不需要的列裁剪
      • 谓词下推:将过滤条件下推
      • 传递闭包:推导出新的过滤条件
      • Runtime Filter:根据集合的范围创造新的过滤条件(min-max,in-list,bloom filter)
    • 主流的RBO是基于经验归纳的优化规则

      优点:实现简单,优化速度快

      缺点:不能保证得到最优的执行计划,不适和多表连接

  3. CBO

    • 执行代价 = 所有算子代价和

      通过RBO得到所有可能的等价执行计划

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

      和算子的输入以及类型有关

    • 统计信息

      • 原始表统计信息

        • 表级,行数,行平均大小,占字节数
        • 列级,min,max,num nulls,num not nulls
      • 推导统计信息

        • 选择率:对于一个过滤条件返回比例数据
        • 基数:在查询计划中常指算自需要处理的行数
      • 准确的统计信息比代价模型本身更重要

    • 统计信息的收集方式

      • 在DDL中指定需要收集的统计信息,在数据库写入时更新:影响写入速率

      • 手动执行触发数据库收集信息

        ANALYZE TABLE TABLE_NAME COMPUTE STATISTICS FOR COLUMNS COLUMN_NAME1,...
        
      • 动态采样

        select count(*) from table_name
        
    • 统计信息推导规则

      • and:fs(a&b) = fs(a) * fs(b)

      • or:fs(a|b) = fs(a) + fs(b) - fs(a&b)

      • not:fs(!a) = 1- fs(a)

      • 等于 x = Iiteral:Iiteral < min || literal > max == 0

        ​ 1/NAD (均匀分别)

      • 小于 x < Iiteral:Iiteral < min == 0

        ​ Iiteral > max == 1

        ​ (Iiteral - min)/(max - min)

    • 统计信息的问题

      • 列和列有关联
      • 列不是均匀分布
    • 执行计划枚举

      • 通常使用贪心算法或者动态规划选出最佳执行计划
    • CBS效果

      • 通常情况下RBO已经能提供较好的查询效率

五.apache calcite

  1. apache calcite

    • 统一的sql查询引擎
    • 模块化,插件化
    • 支持异构模型
    • 内置RBO,CBO
  2. RBO-HepPlanner

    • 优化规则:匹配子树,等价代换得到新的表达式
    • 内置优化规则,然后遍历所有规则
  3. CBO-VolcanoPlanner

    • 基于Volcano/Cascade框架

      • 成本最优假设

      • Memo:存储候选计划

        ​ Group:等价计划集合

      • Top-Down动态规划搜索

六.前沿趋势

  • 存储计算分离:解耦存储和计算
  • 云原生:依赖存储计算分离,K8S,根据负载分配计算节点
  • 湖仓一体:保存原始数据,将数仓和数湖的优点结合
  • DATA+AI
    • AI4DB
      • 自配置:智能调参(QtterTune,QTune),负载预测、调度
      • 自诊断自愈合:错误恢复和迁移
      • 自优化:统计信息,代价估计,学习型优化器(IBM,DB2,LEO),索引视图推荐
    • DB4AI
      • 内嵌人工智能算法(MLSQL,SQLFlow)
      • 内嵌机械学习框架(SparkML,Alink,dl-on-flink)

七.总结

​ 由于sql的便利性,大数据引擎都提供了sql接口,但是sql只是一种声明性语言,所以要优化执行sql的过程,sql的优化器有RBO和CBO,RBO是根据代数关系的优化,由于RBO的优化路径不止一种,所以需要通过CBO选择最优的RBO路径执行