diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/cost/HiveDefaultCostModel.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/cost/HiveDefaultCostModel.java index 2cbfd17c2b..14f547ad37 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/cost/HiveDefaultCostModel.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/cost/HiveDefaultCostModel.java @@ -61,7 +61,9 @@ public RelOptCost getScanCost(HiveTableScan ts, RelMetadataQuery mq) { @Override public RelOptCost getAggregateCost(HiveAggregate aggregate) { - return HiveCost.FACTORY.makeZeroCost(); + final RelMetadataQuery mq = aggregate.getCluster().getMetadataQuery(); + double rowCount = mq.getRowCount(aggregate.getInput()); + return HiveCost.FACTORY.makeCost(rowCount, 0.0, 0.0); } /** diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveAggregateJoinTransposeRule.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveAggregateJoinTransposeRule.java index ed6659c6cc..884e3fdde8 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveAggregateJoinTransposeRule.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveAggregateJoinTransposeRule.java @@ -280,12 +280,18 @@ public void onMatch(RelOptRuleCall call) { } } - if (!aggConvertedToProjects) { + if(aggConvertedToProjects) { + // if aggregate was removed from top, we don't really need to compare costs as we can assume + // this will be better/same plan as before + RelNode r = relBuilder.build(); + call.transformTo(r); + return; + } + relBuilder.aggregate( relBuilder.groupKey(Mappings.apply(mapping, aggregate.getGroupSet()), Mappings.apply2(mapping, aggregate.getGroupSets())), newAggCalls); - } // Make a cost based decision to pick cheaper plan RelNode r = relBuilder.build();