>From Vijay Sarathy <[email protected]>:
Vijay Sarathy has uploaded this change for review. (
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18423 )
Change subject: [ASTERIXDB-3450][COMP] CBO not picking broadcast join for very
small tables
......................................................................
[ASTERIXDB-3450][COMP] CBO not picking broadcast join for very small tables
Change-Id: Ie04758aca3142669811881fad0cda8750c9e2f9b
---
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, 20 insertions(+), 11 deletions(-)
git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb
refs/changes/23/18423/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 e842b7b..e9a8c6f 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
@@ -750,7 +750,7 @@
jn.aliases.addAll(jnJ.aliases);
Collections.sort(jn.aliases);
jn.size = jnI.size + jnJ.size; // These are the original
document sizes
- jn.setCardinality(jn.computeJoinCardinality(), true);
+ jn.setCardinality(jn.computeJoinCardinality());
jn.setSizeVarsAfterScan(jnI.getSizeVarsAfterScan() +
jnJ.getSizeVarsAfterScan());
} else {
addPlansToThisJn = jnNewBits.jnIndex;
@@ -850,20 +850,20 @@
if (idxDetails == null) {
return PlanNode.NO_PLAN;
}
- jn.setOrigCardinality(idxDetails.getSourceCardinality(),
false);
+ jn.setOrigCardinality(idxDetails.getSourceCardinality());
jn.setAvgDocSize(idxDetails.getSourceAvgItemSize());
jn.setSizeVarsFromDisk(10); // dummy value
jn.setSizeVarsAfterScan(10); // dummy value
}
// multiply by the respective predicate selectivities
- jn.setCardinality(jn.origCardinality *
stats.getSelectivity(leafInput, false), false);
+ jn.setCardinality(jn.origCardinality *
stats.getSelectivity(leafInput, false));
} 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, false);
- jn.setCardinality(card, false);
+ jn.setOrigCardinality(card);
+ jn.setCardinality(card);
// just a guess
jn.size = 10;
}
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 9fb0e72..1192796 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
@@ -143,9 +143,9 @@
return cardinality;
}
- protected void setCardinality(double card, boolean setMinCard) {
+ protected void setCardinality(double card) {
// Minimum cardinality for operators is MIN_CARD to prevent bad plans
due to cardinality under estimation errors.
- cardinality = setMinCard ? Math.max(card, Cost.MIN_CARD) : card;
+ cardinality = Math.max(card, Cost.MIN_CARD);
}
public double getOrigCardinality() {
@@ -156,9 +156,9 @@
return cheapestPlanNode;
}
- protected void setOrigCardinality(double card, boolean setMinCard) {
+ protected void setOrigCardinality(double card) {
// Minimum cardinality for operators is MIN_CARD to prevent bad plans
due to cardinality under estimation errors.
- origCardinality = setMinCard ? Math.max(card, Cost.MIN_CARD) : card;
+ origCardinality = card;
}
public void setAvgDocSize(double avgDocSize) {
@@ -364,9 +364,9 @@
if (getCardinality() == getOrigCardinality()) { // this means there
was no selectivity hint provided
// If the sample size is the same as the original dataset (happens
when the dataset
// is small), no need to assign any artificial min. cardinality as
the sample is accurate.
- setCardinality(finalDatasetCard, scaleUp);
+ setCardinality(finalDatasetCard);
}
- setOrigCardinality(origDatasetCard, false);
+ setOrigCardinality(origDatasetCard);
setSizeVarsFromDisk(sizeVarsFromDisk);
setSizeVarsAfterScan(sizeVarsAfterScan);
--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18423
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: Ie04758aca3142669811881fad0cda8750c9e2f9b
Gerrit-Change-Number: 18423
Gerrit-PatchSet: 1
Gerrit-Owner: Vijay Sarathy <[email protected]>
Gerrit-MessageType: newchange