Index: common/src/java/org/apache/hadoop/hive/conf/HiveConf.java =================================================================== --- common/src/java/org/apache/hadoop/hive/conf/HiveConf.java (revision 1617414) +++ common/src/java/org/apache/hadoop/hive/conf/HiveConf.java (working copy) @@ -611,7 +611,6 @@ // CBO related HIVE_CBO_ENABLED("hive.cbo.enable", false, "Flag to control enabling Cost Based Optimizations using Optiq framework."), - HIVE_CBO_MAX_JOINS_SUPPORTED("hive.cbo.max.joins.supported", 10, " Control queries that will be considered for join reordering, based on number of joins in them. Beyond a certain number of joins, the cost of considering possible permutations is prohibitive."), HIVE_CBO_PULLPROJECTABOVEJOIN_RULE("hive.cbo.project.pullabovejoin.rule", false, ""), HIVE_CBO_GREEDY_JOIN_ORDER("hive.cbo.greedy.join.order", false, ""), @@ -1952,7 +1951,7 @@ public static long getLongVar(Configuration conf, ConfVars var) { assert (var.valClass == Long.class) : var.varname; return conf.getLong(var.varname, var.defaultLongVal); - } + } public static long getLongVar(Configuration conf, ConfVars var, long defaultVal) { return conf.getLong(var.varname, defaultVal); Index: ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java (revision 1617414) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java (working copy) @@ -11766,8 +11766,7 @@ private boolean canHandleQuery() { boolean runOptiqPlanner = false; - if ((queryProperties.getJoinCount() < HiveConf.getIntVar(conf, - HiveConf.ConfVars.HIVE_CBO_MAX_JOINS_SUPPORTED)) + if ((queryProperties.getJoinCount() > 1) && !queryProperties.hasClusterBy() && !queryProperties.hasDistributeBy() && !queryProperties.hasSortBy() @@ -11840,41 +11839,12 @@ List list = Lists.newArrayList(); list.add(HiveDefaultRelMetadataProvider.INSTANCE); RelTraitSet desiredTraits = cluster.traitSetOf(HiveRel.CONVENTION, RelCollationImpl.EMPTY); - final boolean bushy = RelOptUtil.countJoins(optiqPreCboPlan) > 3 ? true : false; - if (!bushy) { - planner.registerMetadataProviders(list); - - RelMetadataProvider chainedProvider = ChainedRelMetadataProvider.of(list); - cluster.setMetadataProvider(new CachingRelMetadataProvider(chainedProvider, planner)); - - planner.addRule(HiveSwapJoinRule.INSTANCE); - planner.addRule(HivePushJoinThroughJoinRule.LEFT); - planner.addRule(HivePushJoinThroughJoinRule.RIGHT); - if (HiveConf.getBoolVar(conf, HiveConf.ConfVars.HIVE_CBO_PULLPROJECTABOVEJOIN_RULE)) { - planner.addRule(HivePullUpProjectsAboveJoinRule.BOTH_PROJECT); - planner.addRule(HivePullUpProjectsAboveJoinRule.LEFT_PROJECT); - planner.addRule(HivePullUpProjectsAboveJoinRule.RIGHT_PROJECT); - planner.addRule(HiveMergeProjectRule.INSTANCE); - } - - RelNode rootRel = optiqPreCboPlan; - if (!optiqPreCboPlan.getTraitSet().equals(desiredTraits)) { - rootRel = planner.changeTraits(optiqPreCboPlan, desiredTraits); - } - planner.setRoot(rootRel); - - optiqOptimizedPlan = planner.findBestExp(); - } else { HepProgram hepPgm = null; HepProgramBuilder hepPgmBldr = new HepProgramBuilder().addMatchOrder( HepMatchOrder.BOTTOM_UP).addRuleInstance(new ConvertMultiJoinRule(HiveJoinRel.class)); - if (HiveConf.getBoolVar(conf, HiveConf.ConfVars.HIVE_CBO_GREEDY_JOIN_ORDER)) { hepPgmBldr.addRuleInstance(new LoptOptimizeJoinRule(HiveJoinRel.HIVE_JOIN_FACTORY)); - } else { - hepPgmBldr.addRuleInstance(new OptimizeBushyJoinRule(HiveJoinRel.HIVE_JOIN_FACTORY, - HiveProjectRel.DEFAULT_PROJECT_FACTORY)); - } + hepPgm = hepPgmBldr.build(); HepPlanner hepPlanner = new HepPlanner(hepPgm); @@ -11889,8 +11859,8 @@ hepPlanner.setRoot(rootRel); optiqOptimizedPlan = hepPlanner.findBestExp(); - } + if (LOG.isDebugEnabled()) { LOG.debug("CBO Planning details:\n"); LOG.debug("Original Plan:\n");