SQL Optimizer| 青训营笔记

102 阅读2分钟

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

大数据体系

SQL体现在分析引擎中,分别有批式分析(Spark、hive)、实时分析(flink)、交互分析(Presto、ClickHouse)

SQL处理流程

Parser

  • 抽象语法树AST(abstract syntax tree)
  • 词法分析:拆分字符串,得到数值常量、字符串常量等token
  • 语法分析:将token组成AST node,得到一个AST
  • 实现:递归下降(ClickHouse),Flex和Bison(PostgreSQL)等

Analyzer

  • 检查并绑定Database,table等元信息
  • SQL的合法性检查
  • AST转化成Logical Plan
  • LP:描述SQL分步骤计算操作,即算子

Optimizer

physical plan: 执行计划子树Plan Fragment,目标是最小化网络数据传输,增加Shuffle算子

Executor

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

查询优化器

top-down Optimizer

由上往下遍历计划树,找到完整的最优执行计划

bottom-up Optimizer

由下往上遍历计划树

RBO

实现一般有几百条基于经验归纳得到的优化原则,实践简单,优化速度快,但不保证得到最优的执行计划

关系代数

运算符 等价变换

优化原则

读取数据更少更快 IO 转换数据更少更快 网络 处理数据更少更快 CPU、内存 列裁剪:select,on部分 谓词下推:where 部分 传递闭包: Runtime Filter:

CBO

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

统计信息

原始表:表或者分区级别、列级别 推导统计信息: 选择率:对某个过滤条件,查询会返回多大比例的数据 基数:在查询计划中常指算子需要处理的行数(其准确率很重要)

枚举策略

  • 通常用贪心算法或动态规划选出最优的执行计划(局部最优解推全局最优解)
  • 单表扫描:索引扫描(随机I/O),全表扫描(顺序I/O),如果查询的数据不均衡,索引扫描不如全表扫描
  • 开启CBO的优点:减少了90%的Shuffle数据量;效 率更高

开源社区实践——Apache Calcite

  • 主流的查询优化器都包含RBO和CBO
  • Calcite是大数据领域流行的查询优化器,
  • 其RBO定义了许多优化规则,pattern匹配子树,执行等价变换
  • 其CBO基于Volcano/Cascade框架,其特点是:Memo、动态规划、剪纸

前沿

  • 引擎架构的进化
  • Cloud 云原生、云中立
  • 湖仓一体 Query Federation
  • DATA + AI AI4DB 自配置,自诊断,自愈合,自优化 DB4AI 内嵌人工智能算法(MLSQL,SQLFlow) 内嵌机器学习算法(SparkML,Alink,dl-on-flink)