Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Calcite系列(九):执行流程-优化器优化

Calcite系列(九):执行流程-优化器优化

原创
作者头像
Yiwenwu
修改于 2024-05-10 04:14:55
修改于 2024-05-10 04:14:55
1.2K0
举报
文章被收录于专栏:Calcite剖析Calcite剖析

背景介绍

优化器优化是SQL处理的第四步,也是最核心的一步,优化器优化本质是基于优化规则实现关系代数等价转换

关系代数等价转换:是数据库查询优化中的一个重要概念,指的是将一个关系代数表达式转换为另一个关系代数表达式,尽管这两个表达式的形式有所不同,但它们具有相同的语义且计算结果相同,而新转换的关系表达式的计算性能往往更优于原有的表达式。在Calcite中,关系代数等价转换即为RelNode计划树的等价转换

RelNode计划树等价转换
RelNode计划树等价转换

目前,Calcite内置两类优化器:

  • HepPlanner:RBO(Rule-based Optimizer)基于规则的优化器,将计划树构建为DAG有向无环图,按顺序依次遍历并执行优化规则
  • VolcanoPlanner:CBO(Cost-based Optimizer)基于代价的优化器,基于Volcano/Cascades Optimizer 经典的优化器框架实现,通过Memo维护等价集,使用贪心算法寻找最优解。 除此之外,CBO的优化效果取决于两个关键因素:代价模型(Cost Model)和 统计信息(Statistics)
优化器类型
优化器类型

优化规则

Calcite内置的优化规则超过200条,可分为两个类别:

  • TransformationRule:用于逻辑计划的关系代数等价转换,例如常量折叠、谓词下推、列剪裁等。逻辑计划等价转换并不能保证转换后的计划树更优,其子类SubstitutionRule维护了转换后一定效果更优的规则集
  • ConverterRule用于Calling Convention,实现不同Convention之间的转换,可等价理解为:实现逻辑计划到物理计划的转换

如图展示基于优化规则实现的计划树等价转换:

  1. 常量折叠:在优化时直接计算出常量表达式的值,如图2020+6=2026,将计算后的常量值代替常量表达式,减少查询执行时的常量计算
  2. 谓词下推:将过滤条件(谓词)尽可能提前进行计算和应用,即在计划树中,尽可能将Filter算子下推到树的底层,通过过滤下推降低上层操作的数据输入量
  3. 列剪裁:只获取查询中实际所需的列,通过Project算子移除未使用的列,从而减少使用列和数据处理量
优化效果
优化效果

Calcite通过执行优化规则,实现RelNode等价转换,由三个步骤组成:

  1. 规则匹配模式:基于 RelOptRule#matches 判断规则应用的条件和模式,确保特定树节点,只能应用满足匹配模式的规则,即 实现规则筛选过程
  2. 规则应用:基于RelOptRule#onMatch→RelOptRuleCall#transformTo 触发规则执行,实现计划树的等价转换
  3. 等价节点构建:转换后的等价计划树维护在RelOptRuleCall中,优化器可根据实现要求,构造出对应的等价RelNode

在Calcite中,各类优化器都基于相同的规则应用机制实现计划树等价转换,不同优化器的主要差异在于规则匹配策略和等价节点构建的方式不同。

RBO优化器

下图展示RBO优化器HepPlanner的执行流程,分为三个步骤:

  1. 初始化:将RelNode转换为DAG有向无环图,其中各个顶点使用 HepRelVertex 表示并维护关联的子节点
  2. 搜索最优计划树:遍历DAG按照顺序依次触发规则应用(fireRule),其中遍历顺序可基于HepMatchOrder参数化配置
  3. 构建最优计划树:基于Visitor模式自顶向下遍历DAG顶点,获取对应的RelNode节点,基于转换后RelNode构建出最优计划树

CBO优化器

备注:该CBO流程说明基于Calcite版本V1.21.0展示,与最新Calcite版本存在差异

执行流程

下图展示CBO优化器VolcanoPlanner的执行流程,分为三个步骤:

  1. 初始化:构建等价集,遍历RelNode生成对应的Relset/RelSubset。注册RelSubset时,计算节点代价并添加规则到RuleQueue。
  2. 搜索最优计划树:根据RuleQueue规则队列中弹出匹配条件的优化规则,应用规则后,若新计划树成本更低,则重新注册该等价计划树并将其维护在搜索空间中。退出计划树搜索需满足以下任一条件:(1). RuleQueue中可应用的优化规则为空;(2). 最优计划树COST代价稳定,没有显著下降;(3). 搜索优化超时
  3. 构建最优计划树:退出搜索后,遍历RelSubset维护的最优代价节点,构建出最优计划树

其中,CBO优化器基于RuleQueue (规则队列)维护优化规则集,与RBO顺序匹配规则不同,CBO规则匹配是随机的。主要基于RelSubset中计算的Importance倒序排列,COST代价越高的节点Importance越大,会优先进行规则匹配。

初始化

如图展示VolcanoPlanner初始化的实现流程,初始化执行入口有两个:

  • changeTraits 变更RelNode物理属性,遍历RelNode计划树注册各个节点,基于VolcanoPlanner#addRelToSet 方法生成相对应的RelSet和RelSubset,若已存在等价计划树,则追加到对应的等价集里
  • setRoot 保证AbstractConverter节点在RelSubset计划中已被注册,该节点可用于后续Convention的转换触发

初始化过程中,核心处理主要包括:

  • 代价计算:如下图紫色框所示,注册RelSubset 时,将会调用propagateCostImprovements 方法计算该等价集中的所有计划树COST代价,并独立维护代价非infinite且代价最小的最优计划树,该过程除了计算COST代价也会触发RelNode Importance计算,对应Importance维护在RuleQueue中,用于排序规则的执行顺序
  • 注册规则:如下图红色框所示,注册完RelSubset后,基于fireRules从初始化规则集中匹配出满足该节点的规则子集,并根据Importance将规则子集添加到RelQueue规则队列中

其中,RelSet 代表一组关系代数等价计划树,即等价的逻辑计划树集合;RelSubset属于RelSet子集,代表一组物理属性相同的关系代数等价计划树,即等价的物理计划树集合

搜索最优树

如图展示VolcanoPlanner搜索最优计划树的实现流程:

  1. 基于RuleQueue弹出对应节点匹配的优化规则,通过VolcanoRuleCall触发规则应用以生成新的等价计划树
  2. 基于ensureRegistered方法注册新的等价计划树,如果新计划树的代价低于对应RelSubset等价集中的最优计划树,则重新递归计算父节点代价,并将该计划树维护在Memo搜索空间中

计划树变换

下面将以计划树变换图直观的展示CBO执行流程,示例SQL:select name, num from student where name = 'add'

  1. 初始化changeTraits将RelNode变为RelSubset,代表一组物理属性相同的逻辑计划;setRoot保证AbstractConverter节点注册,由于Convention=NONE,此时COST代价是infinite无穷大
  2. 搜索执行:基于最优计划树搜索,最终得到COST代价最优的计划树,此时COST代价是有限的

CBO最优计划树搜索基于贪心算法和自顶向下动态规划实现,遵循动态规划的最优子结构原理,局部最优可最终得到全局最优。因此,在Memo搜索空间中,可以自顶向下从物理属性相同的RelSubset中选择最优代价的子节点,组合得到最优计划树。

构建最优计划树流程如下图所示:从根节点(Root节点)出发

  1. rel#41 等价集中 EnumerableProject 代价最低,对应子节点为 rel#58
  2. rel#58 等价集中 EnumerableFilter 代价最低,对应子节点为 rel#63
  3. rel#63 等价集中 JdbcToEnumerableConverter 代价最低,对应子节点为 rel#26
  4. rel#26 等价集中 JdbcTableScan 代价最低,且该节点为TableScan叶子节点

统计元数据

Calcite统计元数据体系如下所示,基于 RelNode#computeSelfCost 获取当前节点COST代价,注入RelMetadataProvider,基于 JaninoRelMetadataProvider 动态生成。常用的统计元数据调用处理:

  • RelNode非累计COST代价:RelMetadataQuery#getNonCumulativeCost → RelMdPercentageOriginalRows → RelMdPercentageOriginalRows#getNonCumulativeCost → RelNode#computeSelfCost
  • RelNode数据行数:RelMdRowCount#getRowCount → RelNode#estimateRowCount
  • RelNode最大行数:RelMdMaxRowCount#getMaxRowCount
  • RelNode NDV统计:RelMdDistinctRowCount#getDistinctRowCount
  • RelNode数据排序:RelMdCollation#collations
  • RelNode字段类型:RelMdNodeTypes#getNodeTypes
  • 判断表字段是否为Unique:RelMdColumnUniqueness#areColumnsUnique

Calling Convention

Calling Convention:实现不同Convention转换,在CBO优化阶段完成的。下图展示基于ConvertRule转换规则将计划树从Convention=NONE(代价无穷大infinite)的LogicalPlan转换为Convention=ENUMERABLE(代价有限)的可执行计划。

总结

查询优化器不仅是Calcite项目的核心模块,也是整体数据库系统的核心构建。一个好的查询优化器,可以优化SQL的执行计划逻辑,以更优、更高效的方式下发执行。本文介绍了Calcite优化器模块的执行详情,主要包括:优化规则、RBO优化器执行原理、CBO优化器执行原理、统计元数据等。 通过本文可以初步了解Calcite的设计思想:以优化规则为驱动,支持不同模式的优化执行:RBO是顺序执行,CBO则基于COST统计代价执行最优化选择。

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一篇文章完成Hbase入门
逻辑上,HBase的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列。但从HBase的底层物理存储结构(K-V)来看,HBase更像是一个multi-dimensional map(多维地图)
ha_lydms
2023/11/26
1.5K0
一篇文章完成Hbase入门
HBase篇--HBase常用优化
HBase优化能够让我们对调优有一定的理解,当然企业并不是所有的优化全都用,优化还要根据业务具体实施。
LhWorld哥陪你聊算法
2018/09/13
6.2K0
Hbase入门篇03---Java API使用,HBase高可用配置和架构设计
因为缴费明细的数据记录非常庞大,该公司的信息部门决定使用HBase来存储这些数据。并且,他们希望能够通过Java程序来访问这些数据。
大忽悠爱学习
2023/05/23
9190
Hbase入门篇03---Java API使用,HBase高可用配置和架构设计
图文详解:内存总是不够,我靠HBase说服了Leader为新项目保驾护航
最近在工作中用到了 Hbase 这个数据库,也顺便做了关于 Hbase 的知识记录来分享给大家。其实 Hbase的内容体系真的很多很多,这里介绍的是小羽认为在工作中会用到的一些技术点,希望可以帮助到大家。
浅羽技术
2021/01/05
5650
Hbase面试题(面经)整理
Hbase 中的每张表都通过行键 (rowkey) 按照一定的范围被分割成多个子表(HRegion),默认一个 HRegion 超过 256M 就要被分割成两个,由 HRegionServer 管理,管理哪些 HRegion 由 Hmaster 分配。 HRegion 存取一个子表时,会创建一个 HRegion 对象,然后对表的每个列族 (Column Family) 创建一个 store 实例, 每个 store 都会有 0个或多个 StoreFile 与之对应,每个 StoreFile 都会对应一个 HFile , HFile 就是实际的存储文件,因此,一个 HRegion 还拥有一个 MemStore 实例。
全栈程序员站长
2022/09/04
1.9K0
Hbase面试题(面经)整理
大数据面试题——HBase面试题总结
2)无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列;
全栈程序员站长
2022/09/04
8020
大数据面试题——HBase面试题总结
HBase的读写路径详解与性能调优指南
HBase作为分布式数据库,在大规模数据存储与处理方面展现了强大的能力,特别适用于在线分析处理、时间序列数据处理等场景。由于其基础是Hadoop HDFS的分布式存储架构,因此HBase在提供海量数据存储能力的同时,具备了高吞吐量和水平扩展的特点。HBase提供了强大的存储和读写性能,但为了在实际的生产环境中充分发挥其效能,深入了解HBase的读写路径,并通过性能调优来优化整体数据处理过程是十分必要的。
数字扫地僧
2024/09/05
2550
HBase快速入门系列(9) | HBase优化
  在HBase中Hmaster负责监控RegionServer的生命周期,均衡RegionServer的负载,如果Hmaster挂掉了,那么整个HBase集群将陷入不健康的状态,并且此时的工作状态并不会维持太久。所以HBase支持对Hmaster的高可用配置。
不温卜火
2020/10/28
7140
HBase快速入门系列(9) | HBase优化
大数据知识总结(八):HBase分布式数据库入门到精通
HBase是一个高可靠性、高性能、面向列、可伸缩、实时读写的分布式 NOSQL 数据库。
Lansonli
2025/05/24
1480
大数据知识总结(八):HBase分布式数据库入门到精通
史上最全 | HBase 知识体系吐血总结
HBase 是 BigTable 的开源 Java 版本。是建立在 HDFS 之上,提供高可靠性、高性能、列存储、可伸缩、实时读写 NoSql 的数据库系统。
五分钟学大数据
2021/11/23
5.2K0
史上最全 | HBase 知识体系吐血总结
面试头条:HBASE 存储设计
5、Hbase的表在物理存储上,是按照列族来分割的,不同列族的数据一定存储在不同的文件中
木野归郎
2020/06/12
1.1K0
HBase面试题精讲「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/138352.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/23
4080
HBase面试题精讲「建议收藏」
BigData-Apache HBase数据库
内存和磁盘同时读取,但是将两个数据进行对比,返回时间戳大的数据,所以说HBase读取比写入要慢得多
MiChong
2020/09/24
1.1K0
BigData-Apache HBase数据库
Hbase学习笔记
一、Hbase简介 1.什么是Hbase     HBASE是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBASE技术可在廉价PC Server上搭建起大规模结构化存储集群。     HBASE的目标是存储并处理大型的数据,更具体来说是仅需使用普通的硬件配置,就能够处理由成千上万的行和列所组成的大型数据。     HBASE是Google Bigtable的开源实现,但是也有很多不同之处。比如:Google Bigtable利用GFS作为其文件存储系统,HBASE利用Hadoop HDFS作为其文件存储系统;Google运行MAPREDUCE来处理Bigtable中的海量数据,HBASE同样利用Hadoop MapReduce来处理HBASE中的海量数据;Google Bigtable利用Chubby作为协同服务,HBASE利用Zookeeper作为对应。 2.与传统数据库的对比     传统数据库遇到的问题:         1)数据量很大的时候无法存储         2)没有很好的备份机制         3)数据达到一定数量开始缓慢,很大的话基本无法支撑     HBASE优势:         1)线性扩展,随着数据量增多可以通过节点扩展进行支撑         2)数据存储在hdfs上,备份机制健全         3)通过zookeeper协调查找数据,访问速度块。 3.hbase集群中的角色     1、一个或者多个主节点,Hmaster     2、多个从节点,HregionServer
曼路
2018/10/18
8030
实战大数据,HBase 性能调优指南
在 HBase 中,row key 可以是任意字符串,最大长度 64KB,实际应用中一般为 10~100bytes,存为 byte[]字节数组,一般设计成定长的。
程序狗
2021/12/29
9540
Hbase初识
注意: HBaseAdmin,HTable,ResultScanner 对象最后都要close()
小爷毛毛_卓寿杰
2019/02/13
5370
Hbase初识
Hbase 入门详解
HBase 的全称是 Hadoop Database,是一个分布式的,可扩展,面向列簇的数据库。HDFS 为 Hbase 提供了可靠的底层数据存储服务,Zookeeper 为 Hbase 元数据管理和协调服务,Hbase 是一个通过大量廉价的机器解决海量数据的高速存储和读取的分布式数据库解决方案。HBase 的原型是谷歌的分布式存储系统 BigTable,是谷歌 BigTable 的开源实现。
Se7en258
2021/08/20
1.2K0
HBase快速入门系列(10) | HBase知识点总结(建议收藏!)
  Hbase查询单一数据采用的是get方法,写入数据的方法为put方法(可在回答时说些具体的实现思路)
不温卜火
2020/10/28
8220
HBase快速入门系列(10) | HBase知识点总结(建议收藏!)
HBASE Region数量增多问题描述及解决方案
HBase每张表在底层存储上是由至少一个Region组成,Region实际上就是HBase表的分区。HBase新建一张表时默认Region即分区的数量为1,随着数据增长一个分区在达到一定大小时会自动Split,一分为二。
大鹅
2021/06/16
2.7K1
Hbase(一)了解Hbase与Phoenix
  HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
大道七哥
2019/09/10
2.6K0
Hbase(一)了解Hbase与Phoenix
推荐阅读
相关推荐
一篇文章完成Hbase入门
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档