基于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
问题导读 1.什么是CBO,RBO? 2.什么是执行计划? 3.什么是join,filter? 4.事实表和维度表的区别? Spark的基于成本的优化器(CBO)并讨论Spark是如何收集并存储这些数据、优化查询,并在压力测试查询中展示所带来的性能影响。 这些统计信息同时也有助于我们均衡基于成本的join的重排序优化。我们适配了动态编程算法[Selinger 1979]3 来选取最佳的多路join顺序。 总之,关闭CBO,查询花费了241秒。 使用了CBO的Q25 另一方面,用了CBO,Spark创建了优化方案可以减小中间结果(如下)。在该案例中,Spark创建了浓密树而不是左-深度树。 这是因为使用或没使用CBO的查询计划没有不同 (例如,即使没有CBO, Spark’s Catalyst 优化器的柱状图也可以优化这些查询。
最近遇到了几个生产案例, 整理了其中两个, 把它们做成了test case, 分享给大家. test case 1: 关于降序索引 表: create table t3 as select * from dba_objects; 索引: create index idx_t3_object_id_desc on t3(object_id desc); 模拟业务SQL: select * from (select object_id,object_name from t3 where object_id is not null order by object_id desc )where 如果一定要使用desc索引(有的时候可能会有多字段参与order by,而且有desc和acs不同方向), 可以试试下面两个方法: 如果object_id 没有null值: alter table t3 上面两个案例我认为优化器应该能够做出最好的选择, 实际并不如我们想象的那么美好. oracle数据库有公认的最强大的优化器, 强大如此, 也有一些可以改进的地方. oracle 的优化器是CBO (costed
它属于 LogicalPlan 的优化,所有优化均基于 LogicalPlan 本身的特点,未考虑数据本身的特点,也未考虑算子本身的代价。 ,可计算出指定列的统计信息 ANALYZE TABLE table_name COMPUTE STATISTICS FOR COLUMNS [column1] [,column2] [,column3] 优化多表 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 可并行进行
它属于 LogicalPlan 的优化,所有优化均基于 LogicalPlan 本身的特点,未考虑数据本身的特点,也未考虑算子本身的代价。 更适合本例 [Spark SQL build side with CBO] 优化 Join 类型 在 Spark SQL 中,Join 可分为 Shuffle based Join 和 BroadcastJoin [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 树不再是 RBO Spark SQL 性能优化再进一步 CBO 基于代价的优化 Spark CommitCoordinator 保证数据一致性 Spark 灰度发布在十万级节点上的成功实践 CI CD
咱们来接下来探讨一下 View 和表结合,这时候 CBO 会如何转换用户的 SQL 呢。 通常的一个 View 和表去结合,View 里没什么特殊处理的话,就直接去使用表作 JOIN 即可。 (0)| 00:00:01 | | 3 | TABLE ACCESS FULL| T1 | 2 | 12 | 3 (0)| 00:00:01 | --------- 这种情况下,CBO 就会想展开困难的话,那要是把 View 和表结合的谓词下推到 View 中是不是会产生什么神奇效果呢。 (0)| 00:00:01 | | 3 | VIEW PUSHED PREDICATE | | 1 | 13 | 3 (0)| 00:00:01 | |* 继续通过 10053 EVENT Trace 再去探究一下,CBO 是怎样实现的。
但除了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排序的,则避免创建哈希表 = sorting cost final double cpuCost = algoUtils.computeSortCPUCost(rCount);//等于获取排序CPU成本 // 3. Result return HiveCost.FACTORY.makeCost(rCount, cpuCost, ioCost); } } 3)DefaultCostc默认成本的HiveCost 相对于MR引擎的默认成本模型要完善了很多,越准确的成本模型越有利于CBO构建出越优化的执行计划。
原文链接:袋鼠云数栈基于 CBO 在 Spark SQL 优化上的探索 一、Spark SQL CBO 选型背景 Spark SQL 的优化器有两种优化方式:一种是基于规则的优化方式 (Rule-Based 2、CBO 是 RBO 改进演化的优化方式 CBO 是对 RBO 改进演化的优化方式,它能根据优化规则对关系表达式进行转换,生成多个执行计划,在根据统计信息 (Statistics) 和代价模型 (Cost 3、 CBO 与 RBO 优势对比 ● RBO 优化例子 下面我们来看一个例子:计算 t1 表(大小为:2G)和 t2 表(大小为:1.8G)join 后的行数 上图是: SELECT COUNT( ● CBO 优化例子 而使用 CBO 优化器得到的执行计划图如下: 我们不难看出,CBO 优化器充分考虑到中间结果,感知到中间结果的变化满足能 Broadcast Join 的条件,所以生成的最终执行计划会选择 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
ACOUG年会杨长老的演讲中,曾提到一个问题, 一条SQL语句,两种执行计划的cost值相同,CBO是如何选择执行计划? SQL> begin 2 for i in 1 .. 10000 loop 3 insert into z values(i, i); 4 end loop; 对于以下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:
凸集和凸函数 SOCP Guideline
(3)配置示例 mysql> show variables like '%query_cache%' ; +------------------------------+---------+ | Variable_name
myset.insert(make_pair(a[i],a[j])); cout<<myset.size()<<endl; return 0; } 思考:优化 ,减少枚举变量,只枚举a[i] 如果我们只枚举a[i],比如a[i] = 3,那么如果存在数对(a[i],a[j] + k),假设我枚举数对里较小的值是3,那么根据差是2,较大的肯定就是5,所以,问题就变成
本篇文章用来总结本人对AS3性能优化方面的认识及经验,可能会有一些错误,敬请不吝赐教.如果想了解更多,请参考ADOBE方面的相关只是介绍. 1,关于显示对象: shape -> sprite <MyClass>(20); 3,关于对象池: 缓存一些相同的对象,以便于随时调用.这里强调一些事情: ①:缓存的对象数目:很对情况下,读段时间这个对象可能要用10个,可能要8个,可能12个. 比 publie var $name的效率低.调用函数的成本高,当然这更符合OOP的思想,但不利于性能......还是用public字段吧. 9,关于显示对象的visible 很多时候,AS3程序员都喜欢把不用的显示对象设为 visible = false,这是可以的.但是从Flash Player方面来讲,Visible = false任然值得它去绘制,它比较笨.木有办法,那优化的方案就是,将其移出舞台了. 10,像素处理优化 : 当绘制像素时,使用BitmapData 类的相应方法即可进行一些简单优化。
. ---- 执行优化 [root@opti-slave hunter]# time nohup mysql -u root -p < optimize.sql 2>&1 >> optim.log nohup: redirecting stderr to stdout Enter password: 输入密码后,就开始了优化过程 可以另开一个终端进行监视 [root@opti-slave hunter
t=397735) 2009-11-28 14:16:37 用Speedyfox 优化firefox数据库(http://www.crystalidea.com )。