CBO的统计和系统信息在创建CalcitePlannerAction对象时传入,包括:partitionCache、colStatsCache、columnAccessInfo。 Hive基于CBO优化的解析数据对象流转如下所示: Hive CBO实现内核:在QB转Operator逻辑计划时进行扩展处理,QB → Calcite CBO优化 → Operator。 parameters属性; 字段元数据:基于RPC客户端调用Metastore接口,setPartitionColumnStatistics 更新字段/分区的统计信息; ANALYZE执行 Hive CBO 本文通过背景介绍、解析流程、CBO优化三部分详述Hive CBO原理。Hive SQL核心解析流程包括解析、语义分析、逻辑优化、物理优化步骤。 Hive CBO优化依赖Calcite 火山模型优化器实现,本文介绍了相关的CBO实现原理,CBO统计元数据和ANALYZE执行实现。 我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!
统计信息 Spark 2.2 开始支持CBO优化,触发统计元数据更新的时机如下: ANALYZE:AnalyzeTableCommand、AnalyzeColumnCommand; ALTER:AlterTableAddPartitionCommand
ConnectorMetadata#getTableStatistics获取元数据信息,目前仅Hive Connector、Iceberg Connector支持获取元数据的统计信息,统计信息用于树节点Visitor遍历时进行CBO ConnectorMetadata#getTableStatistics获取元数据信息,目前仅Hive Connector、Iceberg Connector支持获取元数据的统计信息,统计信息用于树节点Visitor遍历的CBO
总之,关闭CBO,查询花费了241秒。 使用了CBO的Q25 另一方面,用了CBO,Spark创建了优化方案可以减小中间结果(如下)。在该案例中,Spark创建了浓密树而不是左-深度树。 下表展示了使用CBO或没使用CBO下所有TPC-DS查询花费的: 首先,要注意的是一半TPC-DS性能查询没有性能的改变。 这是因为使用或没使用CBO的查询计划没有不同 (例如,即使没有CBO, Spark’s Catalyst 优化器的柱状图也可以优化这些查询。 也就是说,在分布式数据库 均衡CBO是非常困难的而这也是向这个方向迈出的一小步。 我们希望你们能在Apache Spark 2.2中尝试新的CBO!
CBO的整体思路是:从逻辑查询计划树,自上而下枚举每个逻辑运算符可能的物理算子,从所有可能的执行路径中选择一条评估代价最小的作为物理查询计划。 CBO核心流程的代码在plan/optimizer.go中的physicalOptimize: func physicalOptimize(logic LogicalPlan) (PhysicalPlan
ACOUG年会杨长老的演讲中,曾提到一个问题, 一条SQL语句,两种执行计划的cost值相同,CBO是如何选择执行计划? 对于以下SQL, select * from z where a=1 and b=1; 根据10053显示,可以看出,IDX_Z_01和IDX_Z_02这两个索引,cost相同,CBO会选择何种执行计划 值相同的索引的选择》 http://www.dbsnake.net/handle-equally-costed-indexes.html 文章总结来讲, 对于Oracle 10gR2及其以上的版本,CBO 先验证(2)的观点,从上面10053可以看出,两个索引的cost相同,叶子块数相同,此时CBO选择的是IDX_Z_01,因为他的名字,排在IDX_Z_02前面, Best:: AccessPath: Index: IDX_Z_02 Col#: 2 LVLS: 1 #LB: 20 #DK: 10000 LB/K: 1.00 DB/K: 1.00 CLUF: 18.00 此时CBO
上面两个案例我认为优化器应该能够做出最好的选择, 实际并不如我们想象的那么美好. oracle数据库有公认的最强大的优化器, 强大如此, 也有一些可以改进的地方. oracle 的优化器是CBO (costed
咱们来接下来探讨一下 View 和表结合,这时候 CBO 会如何转换用户的 SQL 呢。 通常的一个 View 和表去结合,View 里没什么特殊处理的话,就直接去使用表作 JOIN 即可。 这种情况下,CBO 就会想展开困难的话,那要是把 View 和表结合的谓词下推到 View 中是不是会产生什么神奇效果呢。 继续通过 10053 EVENT Trace 再去探究一下,CBO 是怎样实现的。
Resc: 2.0002 Resc_io: 2.0000 Resc_cpu: 7121 Resp: 2.0002 Resp_io: 2.0000 Resc_cpu: 7121 Oracle CBO 0 10-JAN-18 测试时间是1月11日,前一天22:00统计信息采集任务,就认为表中记录数为0,即是一张空表,但是由于索引统计信息正确,显示几千万数据,自然CBO 了解了下,由于做性能测试,10日曾经清理了表数据,11日进行了批量数据导入,但是统计信息,未进行手工采集,因此用了前一天自动采集的,导致统计信息,和表的实际信息不符,为CBO提供了错误的信息,因而选错了执行计划 正如dbsnake书中所说,若系统批量导入数据,建议业务使用前,立即采集相关表的统计信息,因为每日22:00,才会进行统计信息自动采集,之间的时间差,就有可能因为统计信息不准,让CBO选错执行计划。 虽然CBO对于执行计划cost计算,属于机密,但是10053可以间接,让我们了解CBO如何选择,某一个执行计划,再根据表、索引等统计信息,结合来看,有可能就发现一些线索。
刘允于去年7月离开Google此后去向不明,半年后的今天被证实加入360担任CBO(首席商业官)。 他并不属于360搜索,而是整个奇虎的CBO。但几乎可以肯定的是,搜索的商业化是他的重点工作之一。
(二)CBO 从Oracle 7开始就引入了CBO。CBO是基于成本的优化器,它根据可用的访问路径、对象的统计信息、嵌入的Hint来选择一个成本最低的执行计划。 优化器在使用CBO时,主要参照的是表、列及索引的统计信息。 CBO的缺点主要有: ① CBO会默认目标SQL语句WHERE条件中出现的各个列之间是独立的,没有关联关系,并且CBO会依据这个前提条件来计算组合可选择率、Cardinality,进而来估算成本并选择执行计划 这种先天性的缺陷会直接影响CBO对相关文本型字段的可选择率及返回结果集的Cardinality的估算,进而就可能导致CBO选错执行计划。 虽然CBO有上述这些缺点,但是瑕不掩瑜,CBO是目前Oracle中解析目标SQL的不二选择,并且随着Oracle数据库版本不断的进化,CBO也会越来越完善。
这里我们稍微讨论一下CBO对于Cost值相同的索引的选择,可能会有朋友认为在同样Cost的情况下,Oracle会按照索引名的字母顺序来选择索引,实际上并不完全是这样,CBO对于Cost值相同的索引的选择和 原理说明 MOS上文章“Handling of equally ranked (RBO) or costed (CBO) indexes [ID 73167.1]”明确指出——When the CBO See Bug 6734618 这意味着对于Oracle 10gR2及其以上的版本,CBO对于Cost值相同的索引的选择实际上会这样: 1-如果Cost值相同的索引的叶子块数量不同,则Oracle会选择叶子块数量较少的那个索引
所以,CBO 会在作执行计划之前,用一堆十分难懂的机能去转换用户作的 SQL。对于这些转换机能想做一些浅显的整理总结,也希望同时学习的小伙伴们给与斧正。
Join算法 Join Algorithms算法IO、CPU成本估算 Distribution 物理分布类型 HiveDefaultCostModel 默认成本模型 总结 背景 对于基于成本优化器CBO 成本的150倍 hive.cbo.costmodel.local.fs.write = 4.0 向本地文件系统写一个byte的成本值4.0,表示为network传输成本的4.0倍 hive.cbo.costmodel.local.fs.read = hive.cbo.costmodel.cpu,依次类推): CPU成本 = HiveConf.ConfVars.HIVE_CBO_COST_MODEL_CPU 网络成本 = CPU成本 * HiveConf.ConfVars.HIVE_CBO_COST_MODEL_NET 本地文件写成本 = 网络成本 * HiveConf.ConfVars.HIVE_CBO_COST_MODEL_LFS_WRITE 本地文件读成本 = 网络成本 * HiveConf.ConfVars.HIVE_CBO_COST_MODEL_LFS_READ 分布式文件写成本 = 本地文件写成本 * HiveConf.ConfVars.HIVE_CBO_COST_MODEL_HDFS_WRITE 分布式文件读成本 = 本地文件读成本 * HiveConf.ConfVars.HIVE_CBO_COST_MODEL_HDFS_READ
网上有很多优化法则,有的说exists比in效率高,有的说in比exists执行的快,那就要看SQL是如何写的,CBO是如何转换的,是否能转换?当然这种转换不是基于成本的而是“基于启发的转化”。
编辑|SQL和数据库技术(ID:SQLplusDB) CBO 查询转换系列(深入了解Oracle执行计划) CBO 查询转换(1):子查询展开机能(Subquery Unnesting) CBO 查询转换 (2):反结合的NULL识别机能(null aware anti-join ) CBO 查询转换(3):结合谓词下推机能(Join Predicate Pushdown) CBO 查询转换 (4):Group By 配置最优机能(Group By Placement) CBO查询转换(5):星型转换(Star Transformation) CBO查询转换(6):子查询关联集展开机能(unnest correlation
在看一下CBO的动作,我们可以看到启用”Star Transformation“后,上面的SQL文被转换成了下面的SQL文: SELECT "T1" .
● CBO 优化例子 而使用 CBO 优化器得到的执行计划图如下: 我们不难看出,CBO 优化器充分考虑到中间结果,感知到中间结果的变化满足能 Broadcast Join 的条件,所以生成的最终执行计划会选择 三、数栈在 Spark SQL CBO 上的探索 了解完 Spark SQL CBO 的实现原理之后,我们来思考一下第一个问题:大数据平台想要实现支持 Spark SQL CBO 优化的话,需要做些什么 数栈 CBO 的引入大大降低了使用者的学习门槛,用户只需要在 Spark Conf 中开启 CBO-spark.sql.cbo.enabled=true 然后在对应项目中配置好表信息统计就可以做到 SQL AQE 是动态 CBO 的优化方式,是在 CBO 基础上对 SQL 优化技术又一次的性能提升。 如前文所说,CBO 目前的计算对前置的原始表信息统计是仍有依赖的,而且信息统计过时的情况会给 CBO 带来不小的影响。
Hive优化器原理与源码解析系列—CBO成本模型CostModel(一) 这篇文章是关于Tez引擎的CostModel成本模型:HiveTezCostModel Tez引擎的成本模型,相对比较完善, 相对于MR引擎的默认成本模型要完善了很多,越准确的成本模型越有利于CBO构建出越优化的执行计划。
后续将持续更新 Spark CBO 背景 上文Spark SQL 内部原理中介绍的 Optimizer 属于 RBO,实现简单有效。 Spark CBO 原理 CBO 原理是计算所有可能的物理计划的代价,并挑选出代价最小的物理执行计划。其核心在于评估一个给定的物理执行计划的代价。 weight 由 spark.sql.cbo.joinReorder.card.weight 决定,其默认值为 0.7。 未开启 CBO 时,根据表原始数据大小选择 t2 作为build side ? 而开启 CBO 后,基于估计的代价选择 t1 作为 build side。更适合本例 ? 开启 CBO 后, Spark SQL 将执行计划优化如下 ?