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());
   }
 
   /**