SQL 查询优化器浅析笔记(一) | 青训营笔记

195 阅读2分钟

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

课前提问

MySQL和PostgreSQL区别?

一、大数据体系

大数据体系中的SQL

image.png

提问:为什么第一节课要讲SQL

回答:SQL已经成为了一个趋势以及很多框架的一个接口。

例如:有 MySQL、Oracle 之类使用 SQL 作为交互语言的数据库;有 JDBC、ODBC 之类和各种数据库交互的标准接口……

SQL的处理流程

Parser

  1. 把文本变成抽象语法树结构(AST)
  2. 涉及词法分析阶段(拆分字符串,提取关键字,字符串,数值等)和语法分析阶段(把词条按照定义的语法规则组装成抽象语法树结构)
  3. 和编译原理课程里的“前端”知识相关 实现:递归下降;javaCC(Flink)……

Analyzer 和 Logical Plan

Analyzer

  1. 检查并绑定Database,Table,Column等元信息
  2. SQL的合法性检查,比如min/max/AVG的输入是数值
  3. AST->Logical Plan

Logical Plan

  1. 逻辑地描述SQL对应的分步骤计算操作
  2. 计算操作:算子(operator)

查询优化

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

Physical Plan和Excutor

Plan Fragment:执行计划子树

目标:最小化网络数据传输

利用上数据的物理分布(数据亲和性)

增加Shuffle算子

Executor

单机并行:cache,pipeline,SIMD

多机并行:一个fragment对应多个实例

小结

  1. One SQL rules big data all
  2. SQL需要一次经过Parser,Analyzer,Optimizer和Executor的处理
  3. 查询优化器是数据库的大脑,在大数据场景下对查询性能至关重要
  4. 查询优化器需要感知数据分布,充分利用数据的亲和性
  5. 查询优化器按照最小化网络数据传输的目标把逻辑计划拆分成多个物理计划片段

个人思考

SQL在大数据中有着非常重要的地位,随着开发的推进,掌握SQL的基础,以及流程非常有必要,在本笔记中讲述了Parser,Analyzer,Optimizer和Executor的处理。