添加时间:2024-02-28 00:16:42
这是我参与「第四届青训营」笔记创作活动的的第1天。
大数据体系全景 | |||
---|---|---|---|
业务应用 | BI报表、数据挖掘、营销分析、精准推荐 | - | 管控运维 |
数据开发 | Airflow、DAG | - | 集群创建 |
权限管控 | Apache Ranger、GDPR | - | 集群创建 |
分析引擎 | 批式分析:Spark、Hive、MR实时分析:Flink;交互分析:Presto、ClickHouse、Doris | 消息队列:Kafka、Pulsar、NSQ | 集群管理、服务管理 |
资源调度 | YARN、K8S | 消息队列:Kafka、Pulsar、NSQ | 用户管理 |
存储系统 | HDFS、HBase、NAS、Object Store、Data Lake | 消息队列:Kafka、Pulsar、NSQ | 监控报警 |
基础设施 | ECS、存储、VPC | 消息队列:Kafka、Pulsar、NSQ | 日志查询 |
逻辑地描述SQL如何一步一步执行查询计算最终得到结果的分步计划
树中每个节点都是一个算子(Operator),定义对数据集合的计算操作
边代表数据流向 从子节点流向父节点
仅为逻辑流程,无实际的算法
左深树(Left-deep tree):右边必须为表
拆分时充分考虑数据的亲和性,减少网络传输的Cost
小结
- One SQL rules big data all
- SQL需要依次经过Parser,Analyzer,Optimizer和Executor处理
- 查询优化器是数据库的大脑,对查询性能至关重要
- 查询优化器需要感知数据分布,充分利用数据亲和性
- 查询优化器按照最小化网络数据传输的目标把逻辑计划拆分成多个物理计划片段
小结
- 主流RBO实现有几百条基于经验的优化规则
- 优点:实现简单,优化速度快
- 缺点:不保证得到最优的执行计划
- 单表扫描:索引扫描(随机IO)vs全表扫描(顺序IO): 如果查询的数据分布非常不均衡,索引扫描不如全表
- Join的实现:无法区分Hash和SortMerge的优劣
- 两表Hash Join:无法识别小表构建哈希表
- 多表Join:无法确定最优连接顺序,无法确定是否需要探索每种组合(O(N!)),可能内存溢出
使用一个模型估算执行计划的代价,选择代价最小的执行计划
执行计划的代价等于所有算子的执行代价之和
通过RBO得到所有(可能非所有)可能的等价执行计划
算子代价:CPU、内存、磁盘IO、网络IO代价
和算子输入数据的统计信息有关:输入输出结果的行数、每行大小。。。
叶子算子Scan:通过统计原始表数据
中间算子:根据一定的推导规则,从下层算子的统计信息推导得到
和具体的算子类型以及算子的物理实现有关
e.g. Spark Join 算子代价
Filter Selectivity (fs 选择率)
CARDINALITY(FILTER)=CARDINALITY(A)* SELECTIVITY(FILTER)
假设列列独立,列值均匀分布——与现实不符
- 单表扫描:索引扫描(随机IO)vs全表扫描(顺序IO): 如果查询的数据分布非常不均衡,索引扫描不如全表
- Join的实现:无法区分Hash和SortMerge的优劣
- 两表Hash Join:无法识别小表构建哈希表
- 多表Join:无法确定最优连接顺序,无法确定是否需要探索每种组合(O(N!)),可能内存溢出
通常使用贪心算法或动态规划选出最优执行计划,从局部最优解开始推导全局最优解
小结
- CBO使用代价模型和统计信息估算执行计划的代价
- CBO使用贪心或动态规则算法寻找最优执行计划
- 大数据场景下CBO对查询性能非常重要
数据库 | SQL Optimizer选型 |
---|---|
Hive、Flink、Alibaba MaxCompute等 | 基于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 |
- 得到表达式-传递Parser语法解析-实现算子表达式-查询优化
- Expression Builder-实现算子表达式
- Metadata/Plugable rules-查询优化
基于Volcano/Cascade框架
成本最优假设
Memo:存储候选执行计划
应用rule搜索候选计划,通过规则变换计算各种Group的最优代价,记录Group Winner(目前的最优计划)
剪枝(branch-and-bound pruning)减少搜索空间:总Cost-自己的Cost=子节点Cost上限,在变换时可以去除子节点Cost大于上限的路径
Top-down遍历 动态规划搜索:选择winner构建最优执行计划
小结
- 主流的查询优化器都包含RBO和CBO
- Apache Calcite是大数据领域流行的查询优化器
- Apache Calcite RBO定义许多优化规则,使用pattern匹配子树执行等价变换
- Apache Clacite CBO基于volcano/Cascade框架
- Volcano/Cascade精髓在于Memo、动态规划、剪枝
小结
- SQL查询优化器仍然必不可少
- 引擎架构进化、云原生、湖仓一体对SQL查询优化器有新要求新挑战
- AI加持学习型查询优化器在不断进化
Cascade Optimizer在搜索过程中,搜索空间由关系代数算子树组成森林(Memo)。森林中存在Expression Group,每个Group中保存逻辑等价的Group Expression。
Memo本质是AND/OR图,通过共享相同子树减少内存开销,记录搜索过的子树的最优执行计划(Group winner)
Branch-and-Bound Pruning:已搜索完成的physical计划代价最小值成为代价上限(Cost Upper Bound),当新搜索代价高于它时停止搜索。初始上限可有优化器根据启发式规则估算。
地址:海南省海口市电话:0898-08980898传真:0898-1230-5678
Copyright © 2012-2018 耀世娱乐-耀世注册登录入口 版权所有ICP备案编号:琼ICP备xxxxxxxx号