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

100 阅读2分钟

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

大数据体系结构和SQL

Snipaste_2022-07-27_19-37-45.jpg 在分析引擎部分中,Spark、Flink等框架使用的是同样的SQL----“one SQL rules big data all”。

SQL处理流程

Snipaste_2022-07-27_19-59-23.jpg

1.Parser

由String -> AST(abstract syntax tree)抽象语法树,包括词法分析和语法分析:

  • 词法分析:拆分字符串,形成token。
  • 语法分析:将token组成AST node,最终得到AST。

2. Analyzer 和Logical Plan

  • Analyzer : AST-> logical plan
  • Logical Plan: 逻辑描述SQL对应的分步骤计算操作

3. 查询优化

  • SQL是一种声明式语言,用户只描述什么做什么,没有告诉数据库怎么做
  • 目标:找到一个正确且执行代价最小的物理执行计划
  • 查询优化器是数据库的大脑,最复杂的模块,很多问题都是NP问题
  • 一般SQL越复杂,join的表越多,数据量越大,查询优化的意义就越大,不同的执行方式的性能差别可能有成百上千倍。

4. Pysical Plan 和Executor

  • Pysical Plan:物理计划片段,执行计划子树,最小化网络数据传输,利用数据的物理分布(数据亲和性)
  • Executor:单机执行,多机并行

常见的查询优化器

RBO(Rule-based Optimizer)

1. 优化原则

  • 更少的从硬盘中读取数据,更快的读取数据(I/O)
  • 数据传输更少和更快(NetWork)
  • 数据处理更少和更快(CPU和内存)

2.优化规则

列裁剪

Snipaste_2022-07-27_20-07-57.jpg Snipaste_2022-07-27_20-07-20.jpg 只获取需要的列
谓词下推

Snipaste_2022-07-27_20-09-13.jpg 先过滤再连表查询
传递闭包

Snipaste_2022-07-27_20-10-13.jpg 运行时过滤

Snipaste_2022-07-27_20-10-42.jpg

CBO(Cost-based Optimizer)

Snipaste_2022-07-27_20-12-02.jpg

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