SQL优化器介绍| 青训营笔记

309 阅读7分钟

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


一、大数据体系

大数据体系主要分为七层,从下至上依次为:

1.基础设施,主要是ESC,存储,VPC,主要有日志查询管理组件。

2.存储设施,有HDFS,HBase,等自研的存储系统,有监控报警功能。

3.资源调度,有YARN,K8S,主要有用户管理功能。

4.分析引擎,主要分为三类,有批式分析,Spark,Hive,MR;有实时分析Flink;有交互分析Presto等。消息队列主要用Kafka等,主要用于存储的计算的解耦。主要功能是集群管理,服务管理。

5.权限管控,有Apache Ranger,GDPR,用来集群创建。

6.数据开发,主要有一个DAG任务流调度系统和Airflow,用来集群创建。

7.业务应用,有BI报表,数据挖掘,营销分析等,用来管控运维。

二、sql在分布式环境下的处理

sql的处理流程

sql 经过Parser 输出AST,再经过Analyzer 输出Logical Plan逻辑计划,在经过优化器Optimizer处理生成Physical Plan物理计划,交给executor处理数据,返回结果给用户。

1.Parser

  • String->AST,输入字符串,输出抽象语法树。

词法分析:拆分字符串,得到关键词,数值常量,字符串常量,运算符号等token

语法分析:将token组成AST node,最后得到一个AST

  • 实现:可以通过递归下降,开源工具Flex,Bison完成词法分析,语法分析,Flink中通过JAVACC实现等。

2.Analyzer

  • Analyzer

检查并绑定Database,Table,Column等元信息是否存在合法

SQL的合法性检查,比如min/max/avg输入的是否是数值

AST->Logical Plan 输入抽象语法树,输出逻辑计划

  • Logical Plan

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

计算操作:算子(树中的节点)

image.png

从这三张表scan读取数据,join连接算子,将表连接起来,进行聚合group-by,求和,最后TOP-N完成堆排。

  • left-deep tree的特点,join的右边必须是一个表。

3.查询优化(重点)

  • 目标:找到一个正确且执行代价最小的物理执行计划
  • 一般sql越复杂,join的表越多,数据量越大,查询优化的意义就越大

对逻辑计划进行拆分为PlanFragment:执行计划子树

目标:最小化网络数据传输(尽量只读本地,远程会比较慢)

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

增加shuffle算子,一边做发送一边做接收

4.Executor

单机并行:cache,pipeline,SIMD

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

三、查询优化器的分类

1.遍历树的顺序划分

Top-down Optimizer(微软使用)

从目标输出开始,由上往下遍历计划书,找到完整的遍历计划树,找到完整的最优执行计划

例子:Volcano/Cascade,SQLSwrver

Bottom-up Optimizer

从零开始,由下往上便利计划数,找到完整的执行计划

例子:System R(最早的数据库优化器), postgreSQL,IBM DB2

2.优化方法划分

Rule-based Optimizer(RBO)

根据关系代数等价于语义,重写查询

基于启发式规则

会访问表的元信息(catalog),不会涉及具体的表数据(data)

Cost-based Optimizer(CBO)

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

RBO介绍

RBO-关系代数

  • 运算符:select,project,join,rename,union等
  • 等价变换:结合律,交换律,传递性

RBO-优化原则

  • I/O 读更少的数据,读数据更快
  • Network 传输数据更少更快
  • CPU&Memory cpu指令数更少,内存占用更少

RBO-列裁剪

从上到下检查需要哪些列,合并,到最后只需要scan只需要用到的列。 image.png

RBO-谓词下推

在SQL中,谓词是一些表达式,就是返回boolean值即true和false的函数,或是隐式转换为bool的函数。SQL中的谓词主要有 LKIE、BETWEEN、IS NULL、IS NOT NULL、IN、EXISTS。

谓词下推就是将过滤表达式尽可能移动至靠近数据源的位置,以使真正执行时能直接跳过无关的数据。 谓词下推适用情况详见该连接谓词下推简单总结 image.png

RBO-传递 闭包

image.png

推出 pv.siteld > 123

image.png

RBO-Runtime Filter

详细介绍见该链接查询性能优化之 Runtime Filter

image.png

RBO-小结

主流RBO实现一般都有几百条基于经验归纳得到的优化规则

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

image.png

CBO介绍

CBO-概念

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

执行计划的代价等于所有算子的执行代价之和

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

  • 算子代价:CPU,内存,磁盘I/O,网络I/O等代价

和算子输入数据的统计信息有关:算子的输入,输出结果的行数,每行大小

叶子算子Scan:通过统计原始表数据得到

中间算子:根据一定的推到规则,从下层算子的统计信息推导得到

和具体的算子类型,以及算子的物理实现有关

image.png

CBO-统计信息

  • 原始表统计信息

表或者分区级别:行数、行平均大小、表在磁盘中占用了多少字节等

列级别:min、max、num nulls、num not nulls、num distinct value等

  • 推导统计信息

选择率:对于某一个过滤调价,查询会从表中返回多大比例的数据

基数:在查询计划中长治算子需要处理的行数

CBO-统计信息的收集方式

  • 在DDL里致电给需要收集的统计信息,数据库会在数据写入时手机或者更新统计信息(缺点:影响实时导入插入速率) image.png
  • 手动执行 explain analyze statement,触发数据库手机或者更新统计信息(缺点:旧,已经插入没有及时更新) image.png
  • 动态采样

image.png

CBO-统计信息推导规则

假设列和列之间之间是独立的,列的值是均匀分布的

image.png

CBO-统计信息的问题

假设经常与现实不符。

一些列经常是有关联性的,通过用户指定或者数据库自动识别相关联的列进行特殊处理。

中国人口性别,年龄,数量并不均匀分布,使用直方图进行处理。

CBO-执行计划枚举

使用贪心算法或者动态规划选出最优的执行计划。

动态规划:

Hash Join 和SortMerge Join两种连接方式,选出最低cost,将问题扩大,再进行三表连接,分别求出两种连接方式的代价,保留最好的,选出总的最优执行计划。

CBO小结

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

四、数据库以及优化器的前沿趋势

  1. 引擎架构的进化,存储计算分离;一体化(HTAP,HSAP,HTSAP)
  2. Cloud 云原生 severless
  3. 湖仓一体 Queery Federation
  4. DATA+AI

1.AI4DB

  • 自配置

智能调参(OtterTune,QTune)

负载预测、调度

  • 自诊断和自愈合:错误恢复和迁移
  • 自优化:

统计信息估计

代价估计

学习应优化器

索引/试图推荐

2.DB4AI

  • 内嵌人工智能算法(MLSQL,SQLFlow)
  • 内嵌计息学习框架(SparkML,Alink,dl-on-flink)

总结

通过第一次课的学习主要了解了大数据体系,sql的处理流程以及数据库和优化器的前沿趋势,重点了解了查询优化器的分类。优化器的分类可以通过遍历树的顺序划分,也可以通过优化方法划分,主要了解了RBO和CBO两类优化器。RBO是根据经验所得的几百条优化规则,速度快,但可能具有不准确性,CBO主要使用代价模型估计,以及贪心或动态规划算法进行优化策略选择,市面上大多选择RBO和CBO结合使用,sql以及优化器的学习为以后的学习打下了基础。