You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by rh...@apache.org on 2014/10/13 20:02:24 UTC
svn commit: r1631494 -
/hive/branches/branch-0.14/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/stats/HiveRelMdSelectivity.java
Author: rhbutani
Date: Mon Oct 13 18:02:23 2014
New Revision: 1631494
URL: http://svn.apache.org/r1631494
Log:
HIVE-8315 CBO : Negate condition underestimates selectivity which results in an in-efficient plan (Harish Butani via Ashutosh Chauhan)
Modified:
hive/branches/branch-0.14/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/stats/HiveRelMdSelectivity.java
Modified: hive/branches/branch-0.14/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/stats/HiveRelMdSelectivity.java
URL: http://svn.apache.org/viewvc/hive/branches/branch-0.14/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/stats/HiveRelMdSelectivity.java?rev=1631494&r1=1631493&r2=1631494&view=diff
==============================================================================
--- hive/branches/branch-0.14/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/stats/HiveRelMdSelectivity.java (original)
+++ hive/branches/branch-0.14/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/stats/HiveRelMdSelectivity.java Mon Oct 13 18:02:23 2014
@@ -37,6 +37,7 @@ import org.eigenbase.rel.metadata.RelMet
import org.eigenbase.rel.metadata.RelMetadataQuery;
import org.eigenbase.rex.RexNode;
import org.eigenbase.rex.RexUtil;
+import org.eigenbase.util.Pair;
import com.google.common.collect.ImmutableMap;
@@ -67,7 +68,15 @@ public class HiveRelMdSelectivity extend
private Double computeInnerJoinSelectivity(HiveJoinRel j, RexNode predicate) {
double ndvCrossProduct = 1;
- RexNode combinedPredicate = getCombinedPredicateForJoin(j, predicate);
+ Pair<Boolean, RexNode> predInfo =
+ getCombinedPredicateForJoin(j, predicate);
+ if (!predInfo.getKey()) {
+ return
+ new FilterSelectivityEstimator(j).
+ estimateSelectivity(predInfo.getValue());
+ }
+
+ RexNode combinedPredicate = predInfo.getValue();
JoinPredicateInfo jpi = JoinPredicateInfo.constructJoinPredicateInfo(j,
combinedPredicate);
ImmutableMap.Builder<Integer, Double> colStatMapBuilder = ImmutableMap
@@ -175,7 +184,14 @@ public class HiveRelMdSelectivity extend
return ndvCrossProduct;
}
- private RexNode getCombinedPredicateForJoin(HiveJoinRel j, RexNode additionalPredicate) {
+ /**
+ *
+ * @param j
+ * @param additionalPredicate
+ * @return if predicate is the join condition return (true, joinCond)
+ * else return (false, minusPred)
+ */
+ private Pair<Boolean,RexNode> getCombinedPredicateForJoin(HiveJoinRel j, RexNode additionalPredicate) {
RexNode minusPred = RelMdUtil.minusPreds(j.getCluster().getRexBuilder(), additionalPredicate,
j.getCondition());
@@ -184,10 +200,10 @@ public class HiveRelMdSelectivity extend
minusList.add(j.getCondition());
minusList.add(minusPred);
- return RexUtil.composeConjunction(j.getCluster().getRexBuilder(), minusList, true);
+ return new Pair<Boolean,RexNode>(false, minusPred);
}
- return j.getCondition();
+ return new Pair<Boolean,RexNode>(true,j.getCondition());
}
/**