SQL查询优化笔记 | 青训营笔记

102 阅读3分钟

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

大数据体系中的SQL

SQL作为大数据体系中的分析引分为:
    批式引擎:Spark,Hive,MR
    实时引擎:Flink
    交互引擎:Presto,Clickhouse,Doris

SQL处理流程

graph LR
id1[SQL]-->id2[Parser]--AST-->id3[Analizer]--Logical Plan-->id4[Optimizer]--Physical Plan-->id5[Executor]

SQL处理过程(Parser)

Parser将SQL语句转化为AST
    词法分析:拆分字符串得到关键词,数值常量,字符串常量,运算符号的token
    语法分析:将token组成AST node ,得到一个AST
实现方法
    递归下降(clickhouse)
    FlexBison(PostgreSQL)
    Javacc(Flink)
    Antlr(Presto,Spark)
    

SQL处理过程(Analizer)

1:检查并绑定Database,Table,Column等元信息
2SQL合法性检查
3:AST->Logical Plan

SQL处理过程(Logical Plan)

1:逻辑的表示SQL对应的分步骤的计算操作
2:计算操作(算子)

SQL处理过程(查询优化)

SQL语句只能用来表示用户的操作,并不能告诉数据库应该使用哪种计算策略来处理SQL语句
查询优化:找到正确且执行代价最小的物理执行计划
大数据场景下,查询优化很有必要
查询优化器要感知数据分布,充分利用数据的亲和性
查询优化器按照最小化网络传输的目标把逻辑计划把逻辑计划拆分成多个物理执行计划片段

SQL查询优化器

分类:
    RBO(基于规则)
         根据关系代数的等价语义,重写查询
         基于启发式规则
         会访问表的原信息(catalog),不会访问表的具体数据(data)
    CBO(基于代价)
        通过模型估计执行代价,选择代价最小的执行计划
    Top-down Optimizer
        从目标输出开始,从上往下遍历执行树,找到完整的最优执行计划
        例子:Volcano/Cascade SQLserver
    Bottom Up Optimizer
        从零开始,从下往上遍历执行树,找到完整的执行计划
        例如:PostgreSQL System R IBM DB2

关系代数等价语义

运算符:
    Select(σ)
    Project(Π)
    Join(⋈)
    Rename(ρ)
    Union(∪)
等价变化:
    结合律
    交换律
    传递性
RBO 优化规则:

image.png

列裁剪

image.png

谓词下推

image.png

传递闭包

image.png

Runtime Filter

image.png

RBO小结:
    主流RBO基于几百条经验规律
    优点:实现简单,优化速度快
    缺点:并不能得到最优执行计划
    

image.png

CBO

概念:
    选择一个模型估计执行代价,选择最小执行代价的计划
    执行计划代价=所有算子执行代价之和
    通过RBO得到所有可能的等价执行计划
算子代价:
    CPU
    内存
    磁盘IO
    网络IO
和算子输入数据的统计信息有关(输入输出的行数,每行大小)
    叶子算子Scan:通过统计原始表数据得到
    中间算子:根据一定的推导原则,根据下层算子推导
和具体的算子类型,及算子的物理实现计划有关

统计信息:
    

image.png

收集方式:
    

image.png

统计信息推导原则:
    

image.png

统计信息产生的问题:
    由于有些列直接存在关联,所以可以通过SQL自己识别或者用户指定关联列
非均匀分布信息考虑使用直方图

执行计划枚举:
    基于贪心与动态规划
    

image.png

CBO小结
    

image.png