这是我参与「第四届青训营 」笔记创作活动的第一天!
一、大数据体系和SQL。
1.大数据体系中的SQL:
①大数据体系共有七个步骤,分为业务应用、数据开发、权限管控、分析引擎、资源调度、存储系统和基础设施,SQL就是分析引擎,它分为批式分析、实时分析、交互分析等,它的主要工作是集群管理、服务管理。
2.SQL的处理流程:
- 流程图:借助SQL转变为Parser,借助AST由Parser变为Analyzer,借助Logical Plan由Analyzer变成Optimizer,借助Physical Plan由Optimizer变成Executor。
- Parser:
- String->AST(abstract syntax tree)
- 词法分析:拆分字符串,得到关键词、数值常量、字符串常量、运算符号等token
- 语法分析:将token组成AST node,最终得到一个AST
- 实现:递归下降,Flex和Bison,JavaCC,Antlr
- Analyzer和Logical Plan:
- Analyzer:①检查并绑定Database,Table,Column等元信息②SQL的合法性检查,比如min/max/avg的输入是数值③AST->Logical Plan
- Logical Plan:①逻辑地描述SQL对应的分步骤计算操作②计算操作:算子(operator)
- 查询优化:①SQL是一种声明式语言,用户只描述做什么,没有告诉数据库怎么做②目标:找到一个正确且代价最小的物理执行计划③查询优化器是数据库的大脑,最复杂的模块,很多相关问题都是NP的④一般SQL越复杂,Join的表越多,数据量越大,查询优化的意义就越大,因为不同执行方式的性能差别可能成百上千倍
- Physical PLan和 Executor:
- Plan Fragment:执行计划子树
- 目标:最小化网格数据传输
- 利用上数据的物理分布(数据亲和性)
- 增加shuffle算子
- Executor:
- 单机并行:cache,pipeline,SIMD
- 多机并行:一个fragment对应多个实例
二、常见的查询优化器
1.查询优化器的分类:
- Top-down Optimizer:
- 从目标输出开始,由上往下遍历计划树,找到完整的最优执行计划。
- Bottom-up Optimizer:
- 从零开始,由下往上遍历计划树,找到完整的执行计划。
- Rule-based Optimizer(RBO):
- 根据关系代数等价语义,重写查询
- 基于启发式规则
- 会访问标的元信息(catalog),不会涉及具体的表数据(data)
- Cost-based Optimizer(CBO):
- 使用一个模型估算执行计划的代价,选择代价最小的执行计划
2.RBO:
1.RBO-关系代数
- 运算符:Select、Project、Join、Rename、Union等
- 等价交换:结合律、交换律、传递性
- RBO-优化原则:
- 读数据操作尽可能少(I/O)
- 传输数据尽可能少(Network)
- 处理数据尽可能少(CPU&Memory)
- RBO-优化方式:
- 列剪裁
- 将不需要的列信息直接剪裁,大幅度减少查询时读取的数据量
- 谓词下推
- 将数据过滤条件向下推,大幅度减少join操作时所需要读取的数据量
- 传递闭包
- 根据表达式等价关系,过滤条件,推导出一个新的过滤条件,从而减少join操作时所需要读取的数据量
- Runtime Filter
- 在运行时利用列数据的min-max,in-list等信息减少bloom-filter操作时所需要读取的数据量
3. CBO:
1.CBO-概念:
- 使用一个模型估算执行计划的代价,选择代价最小的执行计划
- 执行计划的代价等于所有算子的执行代价之和
- 通过RBO得到所有可能的等价执行计划
- 算子代价:CPU,内存,磁盘I/O,网络I/O等代价
- 和算子输入数据的统计信息有关:输入、输出结果的行数,每行大小...
- 叶子算子Scan:通过统计原始表数据得到
- 中间算子:根据一定的推导规则,从下层算子的统计信息推导得到
- 和具体的算子类型,以及算子的物理实现有关
- 和算子输入数据的统计信息有关:输入、输出结果的行数,每行大小...
- CBO-统计信息:
- 原始表统计信息
- 表或者分区级别:行数、行平均大小、表在磁盘中占用了多少字节等
- 列级别:min、max、num nulls、num not nulls、num distinct value(NDV)、histogram等
- 推导统计信息
- 选择率(selectivity):对于某一个过滤条件,查询会从表中返回多大比例的数据
- 基数(cardinality):在查询计划中常指算子需要处理的行数
- CBO-统计信息收集的方式:
- 在DDL里指定需要收集的统计信息,数据库会在数据写入时收集或者更新统计信息
- 手动执行explain analyze statement,触发数据库收集或者更新统计信息
- 动态采样
- CBO-统计信息推导规划
假设列和列之间是独立的,列的值是均匀分布
5.CBO-统计信息的问题
- 假设经常与现实不符
- 用户指定或者数据库自动识别相关联的列
- CBO-执行计划枚举
CBO通常使用贪心算法或者动态规划选出最优的执行计划
三、社区开源实践。
1.社区开源实践-概览
| 数据库 | SQL Optimzer选型 |
|---|---|
| Hive、Flink、Alibaba MaxComputer等 | 基于Apache Calcite,属于Volcano/Cascade框架 |
| Greenplum、HAWQ | 自研Orca,属于Volcano/Cascade框架 |
| Alibaba Hologres(定位HSAP) | 基于Orca,属于Volcano/Cascade框架 |
| TiDB | 自研,属于Volcano/Cascade框架 |
| Spark | 自研,RBO+CBO |
| Presto | 自研,RBO+CBO |
| Doris | 自研,RBO+CBO |
| ClickHouse | 自研,RBO |
| Alibaba OceanBase | 自研,RBO+CBO |
2.社区开源实践-Apache Calcite概览
- One size fits all:统一的SQL查询引擎
- 模块化,插件化,稳定可靠
- 支持异构数据模型
- 关系型
- 半结构化
- 流式
- 地理空间数据
- 内置RBO和CBO
四、前沿趋势
1.前沿趋势-概览(对SQL优化器的新要求)
- 引擎构架的进化
- 存储计算分离
- 一体化(HTAP、HSAP、HTSAP)
- Cloud
- 云原生
- serverless
- 湖仓一体
- Query Federation
- DATA + AI
2.前沿趋势-DATA+AI
- AI4DB
- 自配置
- 智能调参
- 负载预测/调度
- 自诊断和自愈合:错误恢复和迁移
- 自优化
- 统计信息估计
- 代价估计
- 学习型优化器
- 索引/视图推荐
- 自配置
- DB4AI
- 内嵌人工智能算法(MISQL,SQLFlow)
- 内嵌机器人学习框架(SparkML、Alink、dl-on-flink)
总结
本次学习我记忆最深刻的是RBO和CBO这两个优化器,毕竟是第一次接触,所以在学习的过程中难免会觉得吃力,尤其是这两点,他们的知识点对我来说显得驳杂,不太好理解,下去之后我会多看,争取能有进一步的理解。