基于Operator转为Task,基于物理计划树(算子树) 实现物理优化 CBO优化 实现原理 Hive使用HiveVolcanoPlanner 继承原生的Calcite VolcanoPlanner 实现CBO优化器,CalcitePlanner继承Hive的SemanticAnalyzer(语义解析),Override重写了基于QB获取逻辑算子树Operator的genOPTree方法。 Hive基于CBO优化的解析数据对象流转如下所示: Hive CBO实现内核:在QB转Operator逻辑计划时进行扩展处理,QB → Calcite CBO优化 → Operator。 本文通过背景介绍、解析流程、CBO优化三部分详述Hive CBO原理。Hive SQL核心解析流程包括解析、语义分析、逻辑优化、物理优化步骤。 Hive CBO优化依赖Calcite 火山模型优化器实现,本文介绍了相关的CBO实现原理,CBO统计元数据和ANALYZE执行实现。 我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!
CBO的整体思路是:从逻辑查询计划树,自上而下枚举每个逻辑运算符可能的物理算子,从所有可能的执行路径中选择一条评估代价最小的作为物理查询计划。 CBO核心流程的代码在plan/optimizer.go中的physicalOptimize: func physicalOptimize(logic LogicalPlan) (PhysicalPlan
Spark的基于成本的优化器(CBO)并讨论Spark是如何收集并存储这些数据、优化查询,并在压力测试查询中展示所带来的性能影响。 CBO依赖细节化的统计信息来优化查询计划。要收集这些统计信息,用户可以使用以下这些新的SQL命令: [AppleScript] 纯文本查看 复制代码 ? 查询的性能测试和分析 我们使用非侵入式方法把这些基于成本的优化加入到Spark,通过加入全局配置spark.sql.cbo.enabled来开关这个特性。 总之,关闭CBO,查询花费了241秒。 使用了CBO的Q25 另一方面,用了CBO,Spark创建了优化方案可以减小中间结果(如下)。在该案例中,Spark创建了浓密树而不是左-深度树。 这是因为使用或没使用CBO的查询计划没有不同 (例如,即使没有CBO, Spark’s Catalyst 优化器的柱状图也可以优化这些查询。
另外, like 'xxxxx%' 也用不了降序索引. test case2: with as写法 有些人把with as 的写法当成了SQL优化的方法,好像用了这个语法就能让SQL效率提高, 下面这个案例是把一个复杂的生产案例做了简化 tmp where object_id=100 union all select count(*) from tmp where object_id=200; 上面SQL, 因为tmp被使用了两次, 被优化器自动做了 关于with as的其他两篇文章, 请回顾: < 87-with as写法的5种用途 > 与 <记一个Enq: ss - contention性能问题处理 > 上面两个案例, 从11g到19c, 都是一样的情况 上面两个案例我认为优化器应该能够做出最好的选择, 实际并不如我们想象的那么美好. oracle数据库有公认的最强大的优化器, 强大如此, 也有一些可以改进的地方. oracle 的优化器是CBO (costed
它属于 LogicalPlan 的优化,所有优化均基于 LogicalPlan 本身的特点,未考虑数据本身的特点,也未考虑算子本身的代价。 优化多表 Join 顺序 未开启 CBO 时,Spark SQL 按 SQL 中 join 顺序进行 Join。极端情况下,整个 Join 可能是 left-deep tree。 开启 CBO 后, Spark SQL 将执行计划优化如下 ? 优化后的 Join 有如下优势,因此执行时间降至 71 秒 Join 树不再是 left-deep tree,因此 Join 3 与 Join 4 可并行进行,Join 5 与 Join 6 可并行进行 最大的 Join 5 输出数据只有两百万条结果,Join 6 有 1.49 亿条结果,Join 7相当于小 Join
它属于 LogicalPlan 的优化,所有优化均基于 LogicalPlan 本身的特点,未考虑数据本身的特点,也未考虑算子本身的代价。 [Spark SQL join type selection with CBO] 优化多表 Join 顺序 未开启 CBO 时,Spark SQL 按 SQL 中 join 顺序进行 Join。 后, Spark SQL 将执行计划优化如下 [Spark SQL multi join reorder with CBO] 优化后的 Join 有如下优势,因此执行时间降至 71 秒 Join 树不再是 left-deep tree,因此 Join 3 与 Join 4 可并行进行,Join 5 与 Join 6 可并行进行 最大的 Join 5 输出数据只有两百万条结果,Join 6 有 1.49 RBO Spark SQL 性能优化再进一步 CBO 基于代价的优化 Spark CommitCoordinator 保证数据一致性 Spark 灰度发布在十万级节点上的成功实践 CI CD
但除了MapReduce和Tez外,其他引擎都有自己优化器实现。 优化器在用户HiveConf配置的引擎信息,来使用不同的成本模型。 优化器的成本模型CostModel设计的是否完善、是否科学直接决定着CBO优化器计算构建出执行计划plan是否准确,同样Hive优化器根据CostMode也是基于Hive Operator Tree操作树中节点 = hive.cbo.costmodel.cpu,依次类推): CPU成本 = HiveConf.ConfVars.HIVE_CBO_COST_MODEL_CPU 网络成本 = CPU成本 * HiveConf.ConfVars.HIVE_CBO_COST_MODEL_NET 在这里来确定Join 算法可减少优化器的搜索空间,提高效率。
Logical Plan(未解析逻辑计划); 基于Analyzer#apply规则的匹配作用,绑定树节点信息(元数据Catalog)后生成Logical Plan(逻辑计划); 基于Optimizer#apply优化低效的逻辑树结构 ,生成Optimized Logical Plan(优化逻辑计划); 基于SparkPlanner#plan,根据Optimized Logical Plan匹配对应的Strategy并生成一组Physical 统计信息 Spark 2.2 开始支持CBO优化,触发统计元数据更新的时机如下: ANALYZE:AnalyzeTableCommand、AnalyzeColumnCommand; ALTER:AlterTableAddPartitionCommand
用户写的sql,Oracle会进行等价改写,即使是RBO优化模式,Oracle也会给你做一些转换,这些转化都是基于一种固定的算法,oracle称这种转换是“启发式”的。 网上有很多优化法则,有的说exists比in效率高,有的说in比exists执行的快,那就要看SQL是如何写的,CBO是如何转换的,是否能转换?当然这种转换不是基于成本的而是“基于启发的转化”。 当Oracle没办法做transformation的时候,可能就是sql产生问题的时候,此时就要我们去找原因了,下面通过一些案例,说明这种优化器无能为力的情况(为了保护客户的隐私,表名和部分列已经重命名
Hive优化器原理与源码解析系列—CBO成本模型CostModel(一) 这篇文章是关于Tez引擎的CostModel成本模型:HiveTezCostModel Tez引擎的成本模型,相对比较完善, SMB Join SMB Join又称Sort Merge Bucket Join,是对上述Bucket Map Join关联算法的优化,如果要Join的数据已按Join key排序的,则避免创建哈希表 相对于MR引擎的默认成本模型要完善了很多,越准确的成本模型越有利于CBO构建出越优化的执行计划。
原文链接:袋鼠云数栈基于 CBO 在 Spark SQL 优化上的探索 一、Spark SQL CBO 选型背景 Spark SQL 的优化器有两种优化方式:一种是基于规则的优化方式 (Rule-Based 2、CBO 是 RBO 改进演化的优化方式 CBO 是对 RBO 改进演化的优化方式,它能根据优化规则对关系表达式进行转换,生成多个执行计划,在根据统计信息 (Statistics) 和代价模型 (Cost ● CBO 优化例子 而使用 CBO 优化器得到的执行计划图如下: 我们不难看出,CBO 优化器充分考虑到中间结果,感知到中间结果的变化满足能 Broadcast Join 的条件,所以生成的最终执行计划会选择 四、未来展望 在 CBO 优化方面持续投入研究后,Spark SQL CBO 整体相比较 RBO 而言已经有了很大的性能提升。 AQE 是动态 CBO 的优化方式,是在 CBO 基础上对 SQL 优化技术又一次的性能提升。
ConnectorMetadata#getTableStatistics获取元数据信息,目前仅Hive Connector、Iceberg Connector支持获取元数据的统计信息,统计信息用于树节点Visitor遍历时进行CBO 优化。 ConnectorMetadata#getTableStatistics获取元数据信息,目前仅Hive Connector、Iceberg Connector支持获取元数据的统计信息,统计信息用于树节点Visitor遍历的CBO 优化: Hive统计元数据:调用HiveStatisticsProvider#getTableStatistics方法,底层调用对应Metastore Client RPC接口,包括 getTableStatistics
Select 产品名, sum(价格) from 销售记录表 t1, 产品表 t2, 分类表 t3, 厂家表 t4, 卖家表 t5, 买家表 t6 where t1.产品ID = t2.产品ID and t1.分类ID = t3.分类ID and t1.厂家ID = t4.厂家ID and t1.卖家ID = t5.卖家ID and t1.买家ID = t6.买家ID and t2.产品名 = <aaaa> and t3.分类名 = <bbbb> and t4.厂家名 = <cccc> and t5.卖家名 = <dddd> and t6.买家名 = “Star Transformation”是ORACLE为了解决上面问题,结合ORACLE数据库特有的“Bitmap”索引而作出的优化。 “Star Transformation”是如何实现的呢? 在看一下CBO的动作,我们可以看到启用”Star Transformation“后,上面的SQL文被转换成了下面的SQL文: SELECT "T1" .
ACOUG年会杨长老的演讲中,曾提到一个问题, 一条SQL语句,两种执行计划的cost值相同,CBO是如何选择执行计划? begin 2 for i in 1 .. 10000 loop 3 insert into z values(i, i); 4 end loop; 5 对于以下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:
从上面的代码我们能看出时间复杂度是O(N^2^) 双指针优化 在某些情况下,根据题目要求,j下标并不需要从i+1重新往后枚举一遍,而是跟随着i向后移动,j也向后移动 ? ,x + k - 1) return x + k - 1 以题目样例为例,由于k=5,现有最大整数是13。 Hashtable.find(i) need_card++; return need_card <= M 这样整个算法的时间复杂度是O(PK),P是这个数组的最大值,所以有可能有10^8^这么大,K最大10^5^ ,显然会超时 优化1 第一个能优化的地方是对于X的枚举,也就是顺子开头的数值。 ,X+K) 优化2 第二个可以优化的地方就是判断能不能凑出X开头的顺子。我们利用双指针可以把这一步均摊时间复杂度降到O(1)。
5. 早期编译优化 早期编译优化主要指编译期进行的优化。 javac这类编译器对代码的运行效率几乎没有任何优化措施,但javac做了许多针对java语言代码过程的优化措施来改善程序员的编码风格和提高编码效率,java许多的语法特性都是靠编译器的语法糖来实现的。 遍历循环 遍历循环语句是java5的新特征之一,在遍历数组、集合方面,为开发人员提供了极大的方便。 public void circle() { Integer[] array = { 1, 2, 3, 4, 5 }; for (Integer i : array) { System.out.println 变长参数 Arrays.asList(1, 2, 3, 4, 5); 条件编译 条件编译也是java语言的一种语法糖,根据布尔常量值的真假,编译器将会把分支中不成立的代码块消除掉。
PolarDB for MySQL 云原生数据库的SQL优化,这集一定有人说,和MySQL优化有区别吗?你把那个吗去了,一样我写他做什么。 那么在掌握了MySQL的基本SQL优化手段这个咱们不提了,咱们今天只说PolarDB for MySQL 自己的优化方式。 CONCAT('user_', n), CONCAT('user_', n, '@example.com'), ELT(1 + FLOOR(RAND()*5) MongoDB 查询 优化指南 四句真言 (查询 优化系列 4) 沧海要,《SQL SERVER 运维之道》,清风笑,竟惹寂寥 MySQL SQL 优化指南 SQL 四句真言(优化系列 3) 沧海要, 《SQL SERVER 运维之道》,清风笑,竟惹寂寥 SQL SERVER SQL 优化指南 四句真言 (SQL 优化系列 2) PostgreSQL SQL 优化指南 四句真言(SQL 优化系列 1
: 2 #LB: 102501 #DK: 5038 LB/K: 20.00 DB/K: 145.00 CLUF: 730978.00 Index: DESDATEINDEX Col#: 5 2017/10/17 14213 3 2017/10/16 14127 4 2017/10/15 13841 5 1,2,2,1, 19,3,20,4, 34,5,35,6,7 : 2 #LB: 111409 #DK: 5040 LB/K: 22.00 DB/K: 154.00 CLUF: 779959.00 Index: DESDATEINDEX Col#: 5 虽然CBO对于执行计划cost计算,属于机密,但是10053可以间接,让我们了解CBO如何选择,某一个执行计划,再根据表、索引等统计信息,结合来看,有可能就发现一些线索。
咱们来接下来探讨一下 View 和表结合,这时候 CBO 会如何转换用户的 SQL 呢。 通常的一个 View 和表去结合,View 里没什么特殊处理的话,就直接去使用表作 JOIN 即可。 这种情况下,CBO 就会想展开困难的话,那要是把 View 和表结合的谓词下推到 View 中是不是会产生什么神奇效果呢。 (25)| 00:00:01 | | 4 | HASH GROUP BY | | 1 | 6 | 4 (25)| 00:00:01 | | 5 0)| 00:00:01 | |* 4 | FILTER | | | | | | | 5 继续通过 10053 EVENT Trace 再去探究一下,CBO 是怎样实现的。
刘允于去年7月离开Google此后去向不明,半年后的今天被证实加入360担任CBO(首席商业官)。 他并不属于360搜索,而是整个奇虎的CBO。但几乎可以肯定的是,搜索的商业化是他的重点工作之一。