初识SQL Optimizer| 青训营笔记

187 阅读4分钟

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

前言

第一节课有四个部分,分别是:

  1. 大数据体系和 SQL;
  1. 常见的查询优化器;
  1. 查询优化器的社区开源实践;
  1. SQL 相关的前沿趋势

但是,内容过于深奥,先入个坑吧,因此本篇博客是篇基础知识扫盲文,在课程的四个部分框架下,填补自己不懂的知识。

大数据体系和 SQL

大数据体系中的名词解释

image.png 左边一栏:大数据划分

中间一栏:大数据常用的细分

右边一栏:运维管理组件,更好利用大数据

K8S:容器协调器,一般管理Dockers?

下面三个都是交互性分析:

Presto:大数据分布式 SQL 查询引擎

ClickHourse:一个列式存储的数据库(DBMS),在线分析处理查询,其针对的场景是OLAP,流批一体,未基于Hadoop

Doris:一个基于MPP架构的高性能、实时的分析型数据库

Apache Ranger:一个跨 Hadoop 平台启用、监控和管理综合数据安全性的框架

大数据中的SQL

  • Q:为什么选择SQL?
  • A:简单

One SQL rules big data all

基本上所有的分析引擎都支持了SQL的api

SQL流程

image.png

这一步就是将SQL语言转换为分析引擎认识的语言,更多内容在编译原理有所介绍。

Paeser:将字符串转换为AST(抽象语法树),包括词法分析和语法分析

Analyzer:检查分析合法性,然后输出底层逻辑(Logical Plan)

  • Plan Fragment:执行计划子树,目标:最小化网络数据传输,方式:利用数据上的物理分布(就近),和增加shuffle算子(以后再搞懂)

Optimizer:查询优化器,找到正确且执行代价最小的执行计划

Executor:执行物理计划,按照物理执行计划扫描和处理数据,充分利用机器资源(CPU 流水线,乱序执行,cache,SIMD)

常见Optimize

按照遍历树的顺序划分

  • Top-down Optimizer

  • Bottom-up Optimizer

按照优化的方法划分

  • Rule-based Optimizer,RBO,根据关系代数等价语义,重写查询;是基于启发式规则,会访问表的信息(catalog),不会涉及具体的表数据

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

现在的优化器基本上会混着用,都有使用到

RBO

  • 优化原则
  1. 优化IO:更快更少的读
  2. 优化网络:传输的数据更少更快
  3. 优化CPU和内存:处理的更少更快

优点:实现简单,优化速度快 缺点:不能保证得到最优的执行计划

列裁剪

基本思想:删除不会使用到的列

谓词下推

基本思想:尽早进行过滤,减少不必要开销

传递闭包

基本思想:根据等价代换,构造新的过滤条件

Runtime Fileter (更高级)

基本思想:在执行过程中,记忆化查询,减少不必要开销,加快速度 个人理解:感觉是在过程中及时更新条件,做一步优化一步,让下一步查询的范围缩小

CBO

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

类似于,DP问题,动态规划或贪心,最优解?

通过RBO得到(所有)肯的等价执行计划

image.png

在大数据场景下CBO对查询性能非常重要

社区开源数据库的Optimzer

image.png

Apache Calcite

统一的SQL查询引擎

模块化,插件化,稳定可靠

支持异构数据类型:关系型、半结构化、流式、地理空间数据

内置RBO和CBO

image.png

这块内容,暂时不深入学了,放几张图,用到的时候再来补充

RBO

image.png

CBO

image.png

image.png

Group winnner:目前的最优计划

剪枝:减少搜索空间

Top——down遍历:选择winner构建最优的执行计划

前沿趋势

image.png

image.png

总结

感觉很深奥,是未接触的领域,可能要进入企业之后,深入了解并学习使用,以后再填坑吧~