SQL Optimizer解析笔记

117 阅读5分钟

image.png

这是我参与【第四届青训营】笔记创作活动的第2天

SQL Optimizer解析

一、大数据体系和SQL

1.1 大数据体系

1)市场上云厂商提供大数据相关的产品,包括计算、存储、调度和应用
2)批计算、流计算、交互式分析引擎、YARN等

1.2 编译相关知识

编译概念
利用编译程序从源语言编写的源程序产生目标程序的过程,用编译程序产生目标程序的动作,把人们熟悉的语言转换为2进制语言。
分为五个阶段:
词法分析-> 语法分析 -> 语义检查和中间代码生成 -> 代码优化 -> 目标代码生成
1)词法分析(Lexical Analysis)
概念:
是计算机中将字符序列转换为单词(Token)序列的过程,一般以函数的形式存在,供语法分析器调用,是编译过程的第一阶段。
功能
读取源程序;根据源语言的词法定义依次识别单词;构造单词的内部表示——词法单元;检查词法错误;返回词法单元序列
2)语法分析(Syntactic Analysis)
概念
在Token序列组合成为各类语法短语,语法分析程序判断源程序在结构上是否正确。
3)抽象语法树(Abstract Syntax Tree,AST)
抽象语法树(AST),或简称语法树,是用编程语言编写的源代码的抽象语法结构的树表示。树的每个节点表示源代码中出现的一个构造。语法是“抽象的”,因为它并不代表真实语法中出现的每个细节,而只是结构上的、与内容相关的细节。

3.SQL执行计划

执行计划(execution plan,也叫查询计划或者解释计划)是数据库执行 SQL 语句的具体步骤,例如通过索引还是全表扫描访问表中的数据,连接查询的实现方式和连接的顺序等 Spark SQL的核心是Catalyst优化器,它以一种与众不同的方式利用高级编程语言特性来构建可扩展的查询优化器。Catalyst是一个基于Scala的函数式编程结构设计的可扩展优化器.Catalyst其核心包含一个通用库,用于表示树结构(trees)和作用在树结构上的规则(rules)。我们基于这个框架构建了特定于关系查询处理的库(例如,表达式、逻辑查询计划),以及处理查询执行的不同阶段的几组规则:分析(Analysis)、逻辑优化(Logical Optimizations)、物理计划(Physical Planning)以及将查询部分编译为Java字节码的代码生成技术(Code Generation)。

  • 逻辑计划(Logical Plan)

逻辑地描述SQL对应分步骤计算操作
计算操作:算子

  • 物理计划(Physical Plan)

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

  • 分布式执行计划:Plan Fragment
  • Left-deep tree

SQL基本执行过程image.png1)在打开客户端后,最初需要和sql服务器建立连接,账号认证和校验权限。
2)认证后,客户端发生查询sql脚本给服务器
3)服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段 4)服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划
5)MySQL根据优化器生成的执行计划,再调用存储引擎的API来执行查询。
6)将结果返回给客户端。
7) MySQL 8.0 版本后删除了缓存的功能,官方也是认为该功能在实际的应用场景比较少,所以干脆直接删掉了。

  • 任务调度:DAG(有向无环图)

二、常见的查询优化器

2.1 RBO-关系代数

  • 运算符 :Select、Project、Join、Rename、Union
  • 等价变换
  • 优化规则 :Read data less and faster(I/O) Transfer data less and faster(Network) Process data less and faster(CPU&Memory)
  • 优化手段 :列裁剪、谓词下推(不同的Join如何下推)、传递闭包(根据表达式的关系和过滤条件,推导出新的过滤)、Runtime Filter

2.2CBO

  • 概念

使用一个模型估算执行计划的代价,选择代价最小的执行计划 执行计划的代价等于所有算子的执行代价之和 通过RBO得到所有可能的等价执行计划

  • 算子代价:

CPU,内存,磁盘I/O,网络I/O等代价

  • 统计信息

原始表的统计信息
推导统计信息

  • 统计信息的收集方式

在DDL里需要指定需要收集的统计信息,数据库会在数据写入时收集或者更新统计信息
手动执行explain analyze statement,触发数据库收集或者更新统计信息
动态采样

  • 执行计划枚举

单表扫描 Join的实现
两表Hash Join
多表Join

  • 小结

主要RBO实现一般都有几百条基于经验归纳得到的优化规则
RBO实现简单,优化速度快
RBO不保证得到最优的执行计划
CBO使用代价模型和统计信息估算执行计划的代价
CBO使用贪心或动态规划算法寻找最优的执行计划
大数据场景下CBO对查询性能非常重要