字节跳动青训营 大数据基础班第一课

1,247 阅读6分钟

SQL Optimizer解析

1.大数据体系 2.sql-接口 大数据处理事实的标准 SQL -> Parser AST>Analyzer__Logincal Plan__>Optimizer__Physical__>excuto 3.1 SQL处理流程-Parser String ->AST 拆分字符串 ->得到各种常量 ->token 将token组成AST node 最终得到一个AST

实现:递归下降,Flex和Bison(PostgreSQL),javaCC(Flink),Antlr

3.2 SQL处理流程-Analyzer和Logcial Plan Analyzer 1.检查并绑定Datebase,Table,Column等信息 2.SQL的合法性检查,比如min/max/avg的输入是数值 3.AST->Logical Plan

Logical Plan 1.逻辑地描述SQL对应的发布计算条件 2.计算操作:算子(operator)

3.3SQL的处理流程 - 查询优化 1.SQL是一种声明式语言,用户只描述做什么,没有告诉数据库在怎么做 2.目标:找到一个正确且执行代价最小的物理执行计划 3.查询优化器是数据库的大脑,最复杂的模块,很多相关问题都是NP的 4.一般SQL越复杂,Join的表越多,数据量越大,查询优化的意义就越大

3.4SQL的处理流程-Physcial Plan 和Executor Plan Fragment:执行计划字树 1.目标:最小化网络数据传输 2.利用数据的物理分布(数据亲和性) 3.增加Shuffle算子

Executor 1.单机并行:cache,pipeline,SIMD 2.多机并行:一个fragment对应多个实例

4.常见的查询优化器 4.1查询优化器分类 Top-down Optimizer 1.从目标输出开始,由上往下遍历计划树,找到完整的最优执行计划 2.例子:Volcabo/Cascade,SqlServer Bottom-up Optimizer 1.从零开始,由下往上便利计划树,找到完整的执行条件 System R,PostgreSQL,IBM DB2 重点: Rule-based Optimizer(RBO) 1.根据关系代数等价语义,重写查询 2.基于启发式规则 3.会访问表的元信息,不会访问到具体的表数据 关系代数

Cost-based Optimizer(CDO) 使用一个模型估算执行计划的代价,选择代价最小的执行计划

优化I/O 网络 CPU&内存

4.2RBO小结 主流RBO实现一般都有几百条基于经验归纳达到的优化规则 优点:实现简单,优化速度快 缺点:不保证得到最优的执行计划

4.3CBO概念 使用一个模型估算执行计划的代价,选择代价最小的执行计划 1.执行计划的代价等于所有算子的执行代价之和 2.通过RBO得到所有肯的等价执行计划 算子代价:CPU,内存,磁盘I/O,网络I/O等代价 和算子输入数据的统计信息有关:输入、输出结果的行数,每行的大小 叶子算子Scan:通过统计原始表数据得到 中间算子:根据一定的推搭配规则,从下层算子的统计信息推到得到 和具体的算子的物理实现有关 4.3.1 CBO - 统计信息 原始表统计信息 表或者分区级别:行数、行平均大小、表在磁盘中占用了多少字节等 列级别:min、max、num nulls、num not nulls、num distinct value(NDV)、histogram等 推导统计信息 选择率:对于某一个过滤条件,查询会从表中返回多大比例的数据 基数:在查询计划中常指算子需要的处理的行数 CBO - 统计信息的收集方式 在DDL里指定需要收集的统计信息,数据库会在数据写入时手机或更新统计信息

屏幕截图 2022-07-24 172204.png 手动执行explain analyze statement,触发数据库手机或者更新统计信息

屏幕截图 2022-07-24 172306.png 动态采样

image.png

CBO - 统计信息推导规则 假设列和列之间是独立的,列的值是均匀分布 Filter Selectivity image.png

CBO-统计信息问题

image.png

4.3.2CBO - 执行计划美剧 单表扫描:索引扫描(随机I/O) vs 全表扫描(顺序I/O) 如果查询的数据分布非常不均匀,索引扫描可能不如全表扫描 Join的实现:Hash Join vs SortMerge Join 量表 Hash Join :用小表构建哈希表————如何识别小表 多表Join: 1.哪种连接顺序是最优的? 2.是否要对每种组合都探索? 3.N个表连接,仅仅是left-deep tree就有差不多N!种连接顺序 4.e.g. N = 10 ->总共3,628,800个连接顺序

         通常使用贪心算法或者动态规划选出最优执行计划
         

4.3CBO小节 CBO使用代价模型和统计信息估算执行计划的代价 CBO使用贪心算法或者动态规划算法寻找最优执行计划 在大数据场景下CBO对查询性能非常重要 04.小节 主流RBO实现一般都有几百条基于经

验归纳得到的优化顺序 RBO实现简单,优化速度快 RBO不保证得到最优的执行计划 CBO使用代价模型和统计信息估算执行计划的代价 CBO使用贪心算法或者动态规划算法寻找最优执行计划 在大数据场景下CBO对查询性能非常重要

5.0社区开源实践 社区开源实践 image.png Apache Calcite概述 One size fits all:统一SQL的查询引擎 模块化 插件化,稳定可靠 支持异构数据模型 1.关系型 2.半结构化 3.流式 4.地理空间数据 内置RBO和CBO image.png

5.2 Calcite RBO HepPlanner 优化规则 1.Pattern:匹配表达式子树 2.等价变换:得到新的表达式 内置100+优化规则 四种匹配规则 ARBITRARY/DEPTH_FIRST:深度优先 TOP_DOWN:拓扑顺序 BOTTON_TOP:与TOP_DOWN相反 遍历所有rule 知道没有rule可以被触发 优化速度快,实现简单,但是不保证最优 image.png 5.3 Calcite CBO VolcanoPlanner 基于Volcano/Cascade框架 成本最优假设 Memo:存储候选执行计划 Group:等价计划集合 Top-down 动态规划搜索

image.png

VolcanoPlanner 应用Rule搜索候选计划 Memo 本质:AND/OR graph 共享子树减少内存开销

image.png

VolcanoPlanner 剪枝(Branch-and-bound pruning):减少搜索空间 可行的Aggregate 总的cost=500 自己的cost = 150 孩子节点的cost上限 = 350

image.png

TOP-DOWN 遍历 选择winner构建最优执行计划

image.png 5.4小结 主流的查询优化器都包含RBO和CBO Apache Calcite是大数据领域很流行的查询优化器 Apache Calcite PBO定义了寻多优化规则,使用pattern匹配子树,执行等价变换 Apache Calcite CBO基于Volcano/Cascade框架 Volcano/Cascade的精髓:Memo、动态规划、剪枝

06.前沿趋势

image.png

概览

image.png

DATA + AI AI4DB 自配置 1.智能调参(OtterTune,QTune) 2.负载预测/调度 自诊断和自愈合:错误恢复和迁移 自优化: 1.统计信息估计(Learned cardinalities) 2.代价估计 3.学习型优化型(IBM DB2 LEO) 4,索引/引图推荐 DB4AI 1.内嵌人工智能算法(MLSQL,SQLFLOW) 2.内嵌机器学习框架(SparkML,Alink,dl-on-flink)

image.png