SQL Optimizer解析|青训营笔记

69 阅读2分钟

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

大数据体系

image.png

1. SQL

1.1 SQL的处理流程

 SQL             AST            Logical Plan             Physical Plan
----->  Paresr  -----> Analyzer    ----->    Optinizer       ----->     Executor

Parser:

·String -> AST
词法分析:拆分字符串,得到关键词、数值常量、字符串常量、运算符号等token
语法分析:将token组成AST node,最终得到一个AST
·实现:递归下降(ClickHouse):Flexbison(PostgreSQL),JavaCC(Flink),Antlr(Presto,Spark)

Analyzer和Logical Plan:

·Analyzer:
检查并绑定Database,TableColumn等元信息
SQL的合法性检查,比如min/max/avg的输入是数值
AST -> Logical Plan
·Logical Plan:
逻辑的描述SQL对应的分步骤计算操作
计算操作:算子(operator)

Physical Plan 和 Executor:

·Plan Fragment:执行计划子树
目标:最小优化网络数据传输
利用上数据的物理分布(数据亲和性)
增加Shuffle算子
·Executor:
单机并行:cache,pipeline,SIMD
多机并行:一个fragment对应多个实例

2. 常见的查询优化

2.1 查询优化器分类

Top-down Optimizer

从目标输出开始,由上往下遍历计划树,找到完整的最优执行计划
例子:Volcano/Cascade、SQLServer

Bottom-up Optimizer

从目标输出开始,由下往上遍历计划树,找到完整的执行计划
例子:System R,PostgreSQL,IBM DB2

Rule-based Optiimizer(RBO)

根据关系代数等价语义,重写查询
基于启发式规则
会访问表的元素信息(catalog),不会涉及具体的表数据

Cost-based Optimizer(CBO)

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

RBO:

主流RBO实现一般都有几百条基于经验归纳得到的优化规则
优点:实现简单,优化速度快
缺点:不保证得到最优的执行计划
    单表扫描:索引扫描(随机I/O)vs全表扫描(顺序I/O)
        如果查询的数据分布非常不均衡,索引扫描可能不如全表扫描
    join的实现:Hash join vs SortMerge Join
    两表的Hash Join:用小表构建哈希表——如何识别小表?
    多表Join:
        哪种连接顺序是最优的?
        是否要对每种组合都探索?
            N个表连接,仅仅是left-deep tree就有差不多N!种连接顺序
            e.g.N=10->总共3,628,800个连接顺序

CBO:

 CBO使用代模型和统计信息估算执行计划的代价
 CBO使用贪心或者动态规划算法寻找最优执行计划
 在大数据场景下CBO对查询性能非常重要

关于优化器CBO 和 RBO 还有很多运用实例和具体细节,接下来还需要加深学习!