You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by gu...@apache.org on 2014/08/09 03:29:18 UTC
svn commit: r1616912 - in
/hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq:
RelOptHiveTable.java stats/FilterSelectivityEstimator.java
Author: gunther
Date: Sat Aug 9 01:29:17 2014
New Revision: 1616912
URL: http://svn.apache.org/r1616912
Log:
HIVE-7670: CBO: predicates on partition columns get applied twice in cardinality estimates. (Harish Butani via Gunther Hagleinter)
Modified:
hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/RelOptHiveTable.java
hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/stats/FilterSelectivityEstimator.java
Modified: hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/RelOptHiveTable.java
URL: http://svn.apache.org/viewvc/hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/RelOptHiveTable.java?rev=1616912&r1=1616911&r2=1616912&view=diff
==============================================================================
--- hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/RelOptHiveTable.java (original)
+++ hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/RelOptHiveTable.java Sat Aug 9 01:29:17 2014
@@ -293,4 +293,23 @@ public class RelOptHiveTable extends Rel
return colStatsBldr.build();
}
+
+ /*
+ * use to check if a set of columns are all partition columns.
+ * true only if:
+ * - there is a prunedPartList in place
+ * - all columns in BitSet are partition
+ * columns.
+ */
+ public boolean containsPartitionColumnsOnly(BitSet cols) {
+ if (partitionList == null) {
+ return false;
+ }
+ for (int i = cols.nextSetBit(0); i >= 0; i++, i = cols.nextSetBit(i + 1)) {
+ if (!m_hivePartitionColsMap.containsKey(i)) {
+ return false;
+ }
+ }
+ return true;
+ }
}
Modified: hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/stats/FilterSelectivityEstimator.java
URL: http://svn.apache.org/viewvc/hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/stats/FilterSelectivityEstimator.java?rev=1616912&r1=1616911&r2=1616912&view=diff
==============================================================================
--- hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/stats/FilterSelectivityEstimator.java (original)
+++ hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/stats/FilterSelectivityEstimator.java Sat Aug 9 01:29:17 2014
@@ -1,11 +1,20 @@
package org.apache.hadoop.hive.ql.optimizer.optiq.stats;
+import java.util.BitSet;
+
+import org.apache.hadoop.hive.ql.optimizer.optiq.RelOptHiveTable;
+import org.apache.hadoop.hive.ql.optimizer.optiq.reloperators.HiveTableScanRel;
+import org.eigenbase.rel.FilterRelBase;
+import org.eigenbase.rel.ProjectRel;
+import org.eigenbase.rel.ProjectRelBase;
import org.eigenbase.rel.RelNode;
import org.eigenbase.rel.metadata.RelMetadataQuery;
+import org.eigenbase.relopt.RelOptUtil;
import org.eigenbase.relopt.RelOptUtil.InputReferencedVisitor;
import org.eigenbase.rex.RexCall;
import org.eigenbase.rex.RexInputRef;
import org.eigenbase.rex.RexNode;
+import org.eigenbase.rex.RexUtil;
import org.eigenbase.rex.RexVisitorImpl;
import org.eigenbase.sql.SqlKind;
@@ -28,6 +37,15 @@ public class FilterSelectivityEstimator
return 1.0;
}
+ /*
+ * Ignore any predicates on partition columns
+ * because we have already accounted for these in
+ * the Table row count.
+ */
+ if (isPartitionPredicate(call, m_childRel)) {
+ return 1.0;
+ }
+
Double selectivity = null;
SqlKind op = call.getKind();
@@ -178,4 +196,19 @@ public class FilterSelectivityEstimator
return maxNDV;
}
+
+ private boolean isPartitionPredicate(RexNode expr, RelNode r) {
+ if ( r instanceof ProjectRelBase ) {
+ expr = RelOptUtil.pushFilterPastProject(expr, (ProjectRelBase) r);
+ return isPartitionPredicate(expr, ((ProjectRelBase) r).getChild());
+ } else if ( r instanceof FilterRelBase ) {
+ isPartitionPredicate(expr, ((ProjectRelBase) r).getChild());
+ } else if ( r instanceof HiveTableScanRel ) {
+ RelOptHiveTable table = (RelOptHiveTable)
+ ((HiveTableScanRel)r).getTable();
+ BitSet cols = RelOptUtil.InputFinder.bits(expr);
+ return table.containsPartitionColumnsOnly(cols);
+ }
+ return false;
+ }
}