>From Vijay Sarathy <[email protected]>:

Vijay Sarathy has uploaded this change for review. ( 
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17974 )


Change subject: [ASTERIXDB-AAAA][COMP]: Minimum cardinality issue
......................................................................

[ASTERIXDB-AAAA][COMP]: Minimum cardinality issue

Change-Id: Ife44f819c306752e6fdf6ebcefa4a6abbb5df4c1
---
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinNode.java
2 files changed, 25 insertions(+), 10 deletions(-)



  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/74/17974/1

diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
index d9174d8..8de7bbb 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
@@ -697,7 +697,7 @@
                     jn.aliases.addAll(jnJ.aliases);
                     Collections.sort(jn.aliases);
                     jn.size = jnI.size + jnJ.size;
-                    jn.setCardinality(jn.computeJoinCardinality());
+                    jn.setCardinality(jn.computeJoinCardinality(), true);
                 } else {
                     addPlansToThisJn = jnNewBits.jnIndex;
                 }
@@ -799,18 +799,18 @@
                     if (idxDetails == null) {
                         return PlanNode.NO_PLAN;
                     }
-                    jn.setOrigCardinality(idxDetails.getSourceCardinality());
+                    jn.setOrigCardinality(idxDetails.getSourceCardinality(), 
true);
                     jn.setAvgDocSize(idxDetails.getSourceAvgItemSize());
                 }
                 // multiply by the respective predicate selectivities
-                jn.setCardinality(jn.origCardinality * 
stats.getSelectivity(leafInput, false));
+                jn.setCardinality(jn.origCardinality * 
stats.getSelectivity(leafInput, false), true);
             } else {
                 // could be unnest or assign
                 jn.datasetNames = new 
ArrayList<>(Collections.singleton("unnestOrAssign"));
                 jn.aliases = new 
ArrayList<>(Collections.singleton("unnestOrAssign"));
                 double card = findInListCard(leafInput);
-                jn.setOrigCardinality(card);
-                jn.setCardinality(card);
+                jn.setOrigCardinality(card, false);
+                jn.setCardinality(card, false);
                 // just a guess
                 jn.size = 10;
             }
@@ -950,7 +950,13 @@
                 // now switch the input back.
                 parent.getInputs().get(0).setValue(scanOp);
                 if (jn.getCardinality() == jn.getOrigCardinality()) { // this 
means there was no selectivity hint provided
-                    jn.setCardinality(finalDatasetCard);
+                    boolean setMinCard = true;
+                    if (sampleCard == origDatasetCard) {
+                        // The sample has the whole dataset. This is because 
the dataset is small.
+                        // No need to assign any artificial min. cardinality 
as the sample is accurate.
+                        setMinCard = false;
+                    }
+                    jn.setCardinality(finalDatasetCard, setMinCard);
                 }
                 jn.setAvgDocSize(projectedSize);
             }
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinNode.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinNode.java
index 48d88a9..e554c30 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinNode.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinNode.java
@@ -123,18 +123,18 @@
         return cardinality;
     }

-    protected void setCardinality(double card) {
+    protected void setCardinality(double card, boolean setMinCard) {
         // Minimum cardinality for operators is MIN_CARD to prevent bad plans 
due to cardinality under estimation errors.
-        cardinality = Math.max(card, Cost.MIN_CARD);
+        cardinality = setMinCard ? Math.max(card, Cost.MIN_CARD) : card;
     }

     public double getOrigCardinality() {
         return origCardinality;
     }

-    protected void setOrigCardinality(double card) {
+    protected void setOrigCardinality(double card, boolean setMinCard) {
         // Minimum cardinality for operators is MIN_CARD to prevent bad plans 
due to cardinality under estimation errors.
-        origCardinality = Math.max(card, Cost.MIN_CARD);
+        origCardinality = setMinCard ? Math.max(card, Cost.MIN_CARD) : card;
     }

     protected void setAvgDocSize(double avgDocSize) {

--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17974
To unsubscribe, or for help writing mail filters, visit 
https://asterix-gerrit.ics.uci.edu/settings

Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Change-Id: Ife44f819c306752e6fdf6ebcefa4a6abbb5df4c1
Gerrit-Change-Number: 17974
Gerrit-PatchSet: 1
Gerrit-Owner: Vijay Sarathy <[email protected]>
Gerrit-MessageType: newchange

Reply via email to