>From Vijay Sarathy <[email protected]>:
Vijay Sarathy has uploaded this change for review. (
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17626 )
Change subject: [ASTERIXDB-3208][COMP] Fix for array predicate selectivity
......................................................................
[ASTERIXDB-3208][COMP] Fix for array predicate selectivity
Change-Id: I890b5c2a32b583a8d6e1f23c5f27d2c912ce3ef9
---
M
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/Stats.java
M
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinNode.java
2 files changed, 36 insertions(+), 4 deletions(-)
git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb
refs/changes/26/17626/1
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 7f0a749..6c5b2ca 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
@@ -471,7 +471,8 @@
selOp = new SelectOperator(new MutableObject<>(afce));
selOp.getInputs().add(new MutableObject<>(leafInput));
}
- sel =
joinEnum.getStatsHandle().findSelectivityForThisPredicate(selOp, afce,
this.origCardinality);
+ sel =
joinEnum.getStatsHandle().findSelectivityForThisPredicate(selOp, afce,
+
chosenIndex.getIndexType().equals(DatasetConfig.IndexType.ARRAY),
this.origCardinality);
}
IndexCostInfo.add(new Triple<>(chosenIndex, sel, afce));
}
diff --git
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/Stats.java
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/Stats.java
index 785d56b..b285de2 100644
---
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/Stats.java
+++
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/Stats.java
@@ -372,7 +372,7 @@
}
protected double findSelectivityForThisPredicate(SelectOperator selOp,
AbstractFunctionCallExpression exp,
- double datasetCard) throws AlgebricksException {
+ boolean arrayIndex, double datasetCard) throws AlgebricksException
{
// replace the SelOp.condition with the new exp and replace it at the
end
// The Selop here is the start of the leafInput.
@@ -442,13 +442,35 @@
}
}
}
- // switch the scanOp back
- parent.getInputs().get(0).setValue(scanOp);
double predicateCardinality = (double) ((AInt64)
result.get(0).get(0)).getLongValue();
if (predicateCardinality == 0.0) {
predicateCardinality = 0.0001 *
idxDetails.getSampleCardinalityTarget();
}
+
+ if (arrayIndex) {
+ // In case of array predicates, the sample cardinality should be
computed as
+ // the number of unnested array elements. Run a second sampling
query to compute this.
+ // The query should already have the unnest operation, so simply
replace the select clause with TRUE
+ // to get the unnested cardinality from the sample.
+ // Example query: SELECT count(*) as revenue
+ // FROM orders o, o.o_orderline ol
+ // WHERE ol.ol_delivery_d >= '2016-01-01
00:00:00.000000'
+ // AND ol.ol_delivery_d < '2017-01-01
00:00:00.000000';
+ // ol_delivery_d is part of the array o_orderline
+ // To get the unnested cardinality,we run the following query on
the sample:
+ // SELECT count(*) as revenue
+ // FROM orders o, o.o_orderline ol
+ // WHERE TRUE;
+ ILogicalExpression saveExprs = selOp.getCondition().getValue();
+ selOp.getCondition().setValue(ConstantExpression.TRUE);
+ result = runSamplingQuery(optCtx, selOp);
+ selOp.getCondition().setValue(saveExprs);
+ sampleCard = (double) ((AInt64)
result.get(0).get(0)).getLongValue();
+ }
+ // switch the scanOp back
+ parent.getInputs().get(0).setValue(scanOp);
+
double sel = (double) predicateCardinality / sampleCard;
return sel;
}
--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17626
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: I890b5c2a32b583a8d6e1f23c5f27d2c912ce3ef9
Gerrit-Change-Number: 17626
Gerrit-PatchSet: 1
Gerrit-Owner: Vijay Sarathy <[email protected]>
Gerrit-MessageType: newchange