This is an automated email from the ASF dual-hosted git repository.
vsarathy1 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git
The following commit(s) were added to refs/heads/master by this push:
new bfe645cc19 [ASTERIXDB-3335][COMP]: CBO - CH2 bugs
bfe645cc19 is described below
commit bfe645cc1967d6443dea32d711095849b04840cd
Author: Vijay Sarathy <[email protected]>
AuthorDate: Thu Dec 21 18:46:55 2023 -0800
[ASTERIXDB-3335][COMP]: CBO - CH2 bugs
Change-Id: Ib65cf139a34d087207dd9a4c7de2ffff4ac50d89
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18023
Integration-Tests: Jenkins <[email protected]>
Tested-by: Jenkins <[email protected]>
Reviewed-by: <[email protected]>
Reviewed-by: Vijay Sarathy <[email protected]>
---
.../asterix/optimizer/rules/cbo/JoinEnum.java | 18 ++--
.../apache/asterix/optimizer/rules/cbo/Stats.java | 37 ++++---
.../optimizerts/results_cbo/ch2/ch2_q16.plan | 32 +++---
.../optimizerts/results_cbo/ch2/ch2_q5.plan | 16 +--
.../optimizerts/results_cbo/ch2/ch2_q7.plan | 114 +++++++++++----------
.../optimizerts/results_cbo/ch2/ch2_q8.plan | 20 ++--
.../optimizerts/results_cbo/ch2/ch2_q9.plan | 8 +-
7 files changed, 131 insertions(+), 114 deletions(-)
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 e5166f1b69..243df1891b 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
@@ -402,6 +402,7 @@ public class JoinEnum {
// This finds all the join Conditions in the whole query. This is a global
list of all join predicates.
// It also fills in the dataset Bits for each join predicate.
private void findJoinConditionsAndAssignSels() throws AlgebricksException {
+
List<Mutable<ILogicalExpression>> conjs = new ArrayList<>();
for (JoinOperator jOp : allJoinOps) {
AbstractBinaryJoinOperator joinOp = jOp.getAbstractJoinOp();
@@ -417,7 +418,6 @@ public class JoinEnum {
}
jc.joinCondition = conj.getValue().cloneExpression();
joinConditions.add(jc);
- jc.selectivity =
stats.getSelectivityFromAnnotationMain(jc.joinCondition, true);
}
} else {
if ((expr.getExpressionTag() ==
LogicalExpressionTag.FUNCTION_CALL)) {
@@ -429,32 +429,31 @@ public class JoinEnum {
// change to not a true condition
jc.joinCondition = expr.cloneExpression();
joinConditions.add(jc);
- jc.selectivity =
stats.getSelectivityFromAnnotationMain(jc.joinCondition, true);
}
}
}
// now patch up any join conditions that have variables referenced in
any internal assign statements.
List<LogicalVariable> usedVars = new ArrayList<>();
+ List<AssignOperator> erase = new ArrayList<>();
for (JoinCondition jc : joinConditions) {
usedVars.clear();
ILogicalExpression expr = jc.joinCondition;
expr.getUsedVariables(usedVars);
- List<AssignOperator> erase = new ArrayList<>();
for (AssignOperator aOp : assignOps) {
for (int i = 0; i < aOp.getVariables().size(); i++) {
if (usedVars.contains(aOp.getVariables().get(i))) {
OperatorManipulationUtil.replaceVarWithExpr((AbstractFunctionCallExpression)
expr,
aOp.getVariables().get(i),
aOp.getExpressions().get(i).getValue());
jc.joinCondition = expr;
- jc.selectivity =
stats.getSelectivityFromAnnotationMain(jc.joinCondition, true);
erase.add(aOp);
}
}
}
- for (int i = erase.size() - 1; i >= 0; i--) {
- assignOps.remove(erase.get(i));
- }
+ jc.selectivity =
stats.getSelectivityFromAnnotationMain(jc.joinCondition, true, false);
+ }
+ for (int i = erase.size() - 1; i >= 0; i--) {
+ assignOps.remove(erase.get(i));
}
// now fill the datasetBits for each join condition.
@@ -1143,8 +1142,11 @@ public class JoinEnum {
if (this.singleDatasetPreds.size() > 0) { // We did not have
selectivities for these before. Now we do.
for (JoinCondition jc : joinConditions) {
- jc.selectivity =
stats.getSelectivityFromAnnotationMain(jc.getJoinCondition(), false);
// we may be repeating some work here, but that is ok. This
will rarely happen (happens in q7 tpch)
+ double sel =
stats.getSelectivityFromAnnotationMain(jc.getJoinCondition(), false, true);
+ if (sel != -1) {
+ jc.selectivity = sel;
+ }
}
}
}
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 ae070b4ab4..bfc43fbb11 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
@@ -172,18 +172,20 @@ public class Stats {
// The expression we get may not be a base condition. It could be
comprised of ors and ands and nots. So have to
//recursively find the overall selectivity.
- private double getSelectivityFromAnnotation(AbstractFunctionCallExpression
afcExpr, boolean join)
- throws AlgebricksException {
+ private double getSelectivityFromAnnotation(AbstractFunctionCallExpression
afcExpr, boolean join,
+ boolean singleDatasetPreds) throws AlgebricksException {
double sel = 1.0;
if
(afcExpr.getFunctionIdentifier().equals(AlgebricksBuiltinFunctions.OR)) {
double orSel = getSelectivityFromAnnotation(
- (AbstractFunctionCallExpression)
afcExpr.getArguments().get(0).getValue(), join);
+ (AbstractFunctionCallExpression)
afcExpr.getArguments().get(0).getValue(), join,
+ singleDatasetPreds);
for (int i = 1; i < afcExpr.getArguments().size(); i++) {
ILogicalExpression lexpr =
afcExpr.getArguments().get(i).getValue();
if
(lexpr.getExpressionTag().equals(LogicalExpressionTag.FUNCTION_CALL)) {
sel = getSelectivityFromAnnotation(
- (AbstractFunctionCallExpression)
afcExpr.getArguments().get(i).getValue(), join);
+ (AbstractFunctionCallExpression)
afcExpr.getArguments().get(i).getValue(), join,
+ singleDatasetPreds);
orSel = orSel + sel - orSel * sel;
}
}
@@ -194,7 +196,8 @@ public class Stats {
ILogicalExpression lexpr =
afcExpr.getArguments().get(i).getValue();
if
(lexpr.getExpressionTag().equals(LogicalExpressionTag.FUNCTION_CALL)) {
sel = getSelectivityFromAnnotation(
- (AbstractFunctionCallExpression)
afcExpr.getArguments().get(i).getValue(), join);
+ (AbstractFunctionCallExpression)
afcExpr.getArguments().get(i).getValue(), join,
+ singleDatasetPreds);
andSel *= sel;
}
}
@@ -203,7 +206,8 @@ public class Stats {
ILogicalExpression lexpr =
afcExpr.getArguments().get(0).getValue();
if
(lexpr.getExpressionTag().equals(LogicalExpressionTag.FUNCTION_CALL)) {
sel = getSelectivityFromAnnotation(
- (AbstractFunctionCallExpression)
afcExpr.getArguments().get(0).getValue(), join);
+ (AbstractFunctionCallExpression)
afcExpr.getArguments().get(0).getValue(), join,
+ singleDatasetPreds);
// We want to return 1.0 and not 0.0 if there was no annotation
return (sel == 1.0) ? 1.0 : 1.0 - sel;
}
@@ -224,26 +228,35 @@ public class Stats {
} else {
sel *= s;
}
+ } else if (singleDatasetPreds) {
+ // Single dataset predicates inside join predicates will have
a selectivity annotation.
+ // If the annotation is not present, return -1, so we don't
overwrite previously
+ // computed selectivity.
+ return -1;
}
} else {
JoinProductivityAnnotation jpa =
afcExpr.getAnnotation(JoinProductivityAnnotation.class);
s = findJoinSelectivity(jpa, afcExpr);
sel *= s;
}
- if (join && sel == 1.0) {
+
+ List<LogicalVariable> usedVars = new ArrayList<>();
+ usedVars.clear();
+ afcExpr.getUsedVariables(usedVars);
+ if (join && sel == 1.0 && usedVars.size() == 1) {
// assume no selectivity was assigned
joinEnum.singleDatasetPreds.add(afcExpr);
}
return sel;
}
- protected double getSelectivityFromAnnotationMain(ILogicalExpression
leExpr, boolean join)
- throws AlgebricksException {
+ protected double getSelectivityFromAnnotationMain(ILogicalExpression
leExpr, boolean join,
+ boolean singleDatasetPreds) throws AlgebricksException {
double sel = 1.0;
if
(leExpr.getExpressionTag().equals(LogicalExpressionTag.FUNCTION_CALL)) {
AbstractFunctionCallExpression afcExpr =
(AbstractFunctionCallExpression) leExpr;
- sel = getSelectivityFromAnnotation(afcExpr, join);
+ sel = getSelectivityFromAnnotation(afcExpr, join,
singleDatasetPreds);
}
return sel;
@@ -261,7 +274,7 @@ public class Stats {
while (op.getOperatorTag() != LogicalOperatorTag.EMPTYTUPLESOURCE) {
if (op.getOperatorTag() == LogicalOperatorTag.SELECT) {
SelectOperator selOper = (SelectOperator) op;
- sel *=
getSelectivityFromAnnotationMain(selOper.getCondition().getValue(), join);
+ sel *=
getSelectivityFromAnnotationMain(selOper.getCondition().getValue(), join,
false);
}
if (op.getOperatorTag() == LogicalOperatorTag.SUBPLAN) {
sel *= getSelectivity((SubplanOperator) op);
@@ -278,7 +291,7 @@ public class Stats {
while (true) {
if (op.getOperatorTag() == LogicalOperatorTag.SELECT) {
SelectOperator selOper = (SelectOperator) op;
- sel *=
getSelectivityFromAnnotationMain(selOper.getCondition().getValue(), false);
+ sel *=
getSelectivityFromAnnotationMain(selOper.getCondition().getValue(), false,
false);
}
if (op.getInputs().size() > 0) {
op = op.getInputs().get(0).getValue();
diff --git
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q16.plan
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q16.plan
index 715a29346a..11ad1fae9d 100644
---
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q16.plan
+++
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q16.plan
@@ -33,33 +33,33 @@
-- HASH_PARTITION_EXCHANGE [$$133,
$$134] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
- -- HYBRID_HASH_JOIN
[$$138][$$137] |PARTITIONED|
+ -- NESTED_LOOP |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
-- STREAM_PROJECT
|PARTITIONED|
-- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
- -- NESTED_LOOP
|PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
+ -- HYBRID_HASH_JOIN
[$$138][$$137] |PARTITIONED|
+ --
HASH_PARTITION_EXCHANGE [$$138] |PARTITIONED|
-- STREAM_PROJECT
|PARTITIONED|
-- ASSIGN
|PARTITIONED|
--
ONE_TO_ONE_EXCHANGE |PARTITIONED|
--
DATASOURCE_SCAN (test.stock) |PARTITIONED|
--
ONE_TO_ONE_EXCHANGE |PARTITIONED|
--
EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- BROADCAST_EXCHANGE
|PARTITIONED|
- -- ASSIGN
|PARTITIONED|
+ --
HASH_PARTITION_EXCHANGE [$$137] |PARTITIONED|
+ -- STREAM_SELECT
|PARTITIONED|
-- STREAM_PROJECT
|PARTITIONED|
- -- STREAM_SELECT
|PARTITIONED|
- -- ASSIGN
|PARTITIONED|
- --
STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN
|PARTITIONED|
+ --
ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ --
DATASOURCE_SCAN (test.item) |PARTITIONED|
--
ONE_TO_ONE_EXCHANGE |PARTITIONED|
- --
DATASOURCE_SCAN (test.supplier) |PARTITIONED|
- --
ONE_TO_ONE_EXCHANGE |PARTITIONED|
- --
EMPTY_TUPLE_SOURCE |PARTITIONED|
+ --
EMPTY_TUPLE_SOURCE |PARTITIONED|
-- BROADCAST_EXCHANGE
|PARTITIONED|
- -- STREAM_SELECT
|PARTITIONED|
+ -- ASSIGN |PARTITIONED|
-- STREAM_PROJECT
|PARTITIONED|
- -- ASSIGN |PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
- -- DATASOURCE_SCAN
(test.item) |PARTITIONED|
+ -- STREAM_SELECT
|PARTITIONED|
+ -- ASSIGN
|PARTITIONED|
+ -- STREAM_PROJECT
|PARTITIONED|
--
ONE_TO_ONE_EXCHANGE |PARTITIONED|
- --
EMPTY_TUPLE_SOURCE |PARTITIONED|
+ --
DATASOURCE_SCAN (test.supplier) |PARTITIONED|
+ --
ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ --
EMPTY_TUPLE_SOURCE |PARTITIONED|
diff --git
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q5.plan
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q5.plan
index e58b399abc..19bf0b11d1 100644
---
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q5.plan
+++
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q5.plan
@@ -23,21 +23,21 @@
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- HYBRID_HASH_JOIN [$$274, $$290][$$266,
$$269] |PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$274, $$290]
|PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- HYBRID_HASH_JOIN [$$256][$$257]
|PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE
[$$256] |PARTITIONED|
-- STREAM_PROJECT
|PARTITIONED|
-- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
-- HYBRID_HASH_JOIN
[$$258][$$274] |PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
+ --
HASH_PARTITION_EXCHANGE [$$258] |PARTITIONED|
-- STREAM_PROJECT
|PARTITIONED|
--
ONE_TO_ONE_EXCHANGE |PARTITIONED|
--
HYBRID_HASH_JOIN [$$260, $$254, $$263][$$276, $$277, $$278] |PARTITIONED|
- --
ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ --
HASH_PARTITION_EXCHANGE [$$260, $$254, $$263] |PARTITIONED|
--
STREAM_PROJECT |PARTITIONED|
--
ONE_TO_ONE_EXCHANGE |PARTITIONED|
--
HYBRID_HASH_JOIN [$$245, $$246][$$254, $$281] |PARTITIONED|
@@ -63,7 +63,7 @@
-- DATASOURCE_SCAN (test.orders) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- --
BROADCAST_EXCHANGE |PARTITIONED|
+ --
HASH_PARTITION_EXCHANGE [$$276, $$277, $$278] |PARTITIONED|
--
STREAM_PROJECT |PARTITIONED|
-- ASSIGN
|PARTITIONED|
--
STREAM_PROJECT |PARTITIONED|
@@ -71,7 +71,7 @@
--
DATASOURCE_SCAN (test.customer) |PARTITIONED|
--
ONE_TO_ONE_EXCHANGE |PARTITIONED|
--
EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- BROADCAST_EXCHANGE
|PARTITIONED|
+ --
HASH_PARTITION_EXCHANGE [$$274] |PARTITIONED|
-- STREAM_PROJECT
|PARTITIONED|
-- ASSIGN
|PARTITIONED|
-- STREAM_PROJECT
|PARTITIONED|
@@ -79,7 +79,7 @@
--
DATASOURCE_SCAN (test.nation) |PARTITIONED|
--
ONE_TO_ONE_EXCHANGE |PARTITIONED|
--
EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- BROADCAST_EXCHANGE
|PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE
[$$257] |PARTITIONED|
-- STREAM_PROJECT
|PARTITIONED|
-- STREAM_SELECT
|PARTITIONED|
-- ASSIGN |PARTITIONED|
@@ -88,7 +88,7 @@
-- DATASOURCE_SCAN
(test.region) |PARTITIONED|
--
ONE_TO_ONE_EXCHANGE |PARTITIONED|
--
EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- BROADCAST_EXCHANGE |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$266, $$269]
|PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
diff --git
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q7.plan
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q7.plan
index b17c6bc324..91cd909b63 100644
---
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q7.plan
+++
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q7.plan
@@ -18,85 +18,87 @@
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$303, $$324][$$277, $$300]
|PARTITIONED|
+ -- STREAM_SELECT |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STREAM_PROJECT |PARTITIONED|
- -- ASSIGN |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$277][$$303] |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$310,
$$311][$$275, $$276] |PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$324][$$300]
|PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$324]
|PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
- -- HYBRID_HASH_JOIN [$$305,
$$306, $$307][$$291, $$293, $$295] |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
- -- STREAM_PROJECT
|PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
- -- HYBRID_HASH_JOIN
[$$304][$$288] |PARTITIONED|
+ -- HYBRID_HASH_JOIN
[$$288][$$304] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE
[$$288] |PARTITIONED|
+ -- STREAM_PROJECT
|PARTITIONED|
-- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
- -- STREAM_PROJECT
|PARTITIONED|
- --
ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- NESTED_LOOP
|PARTITIONED|
+ -- HYBRID_HASH_JOIN
[$$291, $$293, $$295][$$305, $$306, $$307] |PARTITIONED|
+ --
HASH_PARTITION_EXCHANGE [$$291, $$293, $$295] |PARTITIONED|
+ --
STREAM_PROJECT |PARTITIONED|
--
ONE_TO_ONE_EXCHANGE |PARTITIONED|
- --
STREAM_PROJECT |PARTITIONED|
- -- ASSIGN
|PARTITIONED|
- --
ONE_TO_ONE_EXCHANGE |PARTITIONED|
- --
REPLICATE |PARTITIONED|
- --
ONE_TO_ONE_EXCHANGE |PARTITIONED|
- --
STREAM_PROJECT |PARTITIONED|
-
-- ASSIGN |PARTITIONED|
-
-- STREAM_PROJECT |PARTITIONED|
-
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-
-- DATASOURCE_SCAN (test.nation) |PARTITIONED|
-
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- --
BROADCAST_EXCHANGE |PARTITIONED|
- -- REPLICATE
|PARTITIONED|
- --
ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ --
HYBRID_HASH_JOIN [$$275, $$276][$$310, $$311] |PARTITIONED|
+ --
HASH_PARTITION_EXCHANGE [$$275, $$276] |PARTITIONED|
--
STREAM_PROJECT |PARTITIONED|
--
ASSIGN |PARTITIONED|
--
STREAM_PROJECT |PARTITIONED|
--
ONE_TO_ONE_EXCHANGE |PARTITIONED|
-
-- DATASOURCE_SCAN (test.nation) |PARTITIONED|
+
-- DATASOURCE_SCAN (test.stock) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- BROADCAST_EXCHANGE
|PARTITIONED|
- -- ASSIGN
|PARTITIONED|
- -- STREAM_PROJECT
|PARTITIONED|
+ --
HASH_PARTITION_EXCHANGE [$$310, $$311] |PARTITIONED|
+ --
STREAM_PROJECT |PARTITIONED|
+ --
STREAM_SELECT |PARTITIONED|
+ --
STREAM_PROJECT |PARTITIONED|
+ --
ASSIGN |PARTITIONED|
+
-- STREAM_PROJECT |PARTITIONED|
+
-- UNNEST |PARTITIONED|
+
-- STREAM_PROJECT |PARTITIONED|
+
-- ASSIGN |PARTITIONED|
+
-- STREAM_PROJECT |PARTITIONED|
+
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+
-- DATASOURCE_SCAN (test.orders) |PARTITIONED|
+
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ --
HASH_PARTITION_EXCHANGE [$$305, $$306, $$307] |PARTITIONED|
-- ASSIGN
|PARTITIONED|
--
STREAM_PROJECT |PARTITIONED|
- --
ONE_TO_ONE_EXCHANGE |PARTITIONED|
- --
DATASOURCE_SCAN (test.customer) |PARTITIONED|
+ -- ASSIGN
|PARTITIONED|
+ --
STREAM_PROJECT |PARTITIONED|
--
ONE_TO_ONE_EXCHANGE |PARTITIONED|
- --
EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- BROADCAST_EXCHANGE
|PARTITIONED|
- -- STREAM_PROJECT
|PARTITIONED|
- -- STREAM_SELECT
|PARTITIONED|
- -- STREAM_PROJECT
|PARTITIONED|
- -- ASSIGN
|PARTITIONED|
+ --
DATASOURCE_SCAN (test.customer) |PARTITIONED|
+ --
ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ --
EMPTY_TUPLE_SOURCE |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE
[$$304] |PARTITIONED|
+ -- REPLICATE
|PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
-- STREAM_PROJECT
|PARTITIONED|
- -- UNNEST
|PARTITIONED|
+ -- ASSIGN
|PARTITIONED|
--
STREAM_PROJECT |PARTITIONED|
- -- ASSIGN
|PARTITIONED|
- --
STREAM_PROJECT |PARTITIONED|
+ --
ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ --
DATASOURCE_SCAN (test.nation) |PARTITIONED|
--
ONE_TO_ONE_EXCHANGE |PARTITIONED|
- --
DATASOURCE_SCAN (test.orders) |PARTITIONED|
- --
ONE_TO_ONE_EXCHANGE |PARTITIONED|
- --
EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- BROADCAST_EXCHANGE |PARTITIONED|
+ --
EMPTY_TUPLE_SOURCE |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$300]
|PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
- -- DATASOURCE_SCAN
(test.stock) |PARTITIONED|
+ -- DATASOURCE_SCAN
(test.supplier) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
-- EMPTY_TUPLE_SOURCE
|PARTITIONED|
- -- BROADCAST_EXCHANGE |PARTITIONED|
- -- STREAM_PROJECT |PARTITIONED|
- -- ASSIGN |PARTITIONED|
+ -- BROADCAST_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- DATASOURCE_SCAN (test.supplier)
|PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- REPLICATE |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT
|PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
+ -- DATASOURCE_SCAN
(test.nation) |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE
|PARTITIONED|
diff --git
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q8.plan
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q8.plan
index cf15f10a11..16343e77f5 100644
---
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q8.plan
+++
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q8.plan
@@ -24,25 +24,25 @@
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- HYBRID_HASH_JOIN [$$347][$$341]
|PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$347]
|PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
-- HYBRID_HASH_JOIN
[$$308][$$309] |PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE
[$$308] |PARTITIONED|
-- STREAM_PROJECT
|PARTITIONED|
-- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
-- HYBRID_HASH_JOIN
[$$311][$$331] |PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
+ --
HASH_PARTITION_EXCHANGE [$$311] |PARTITIONED|
-- STREAM_PROJECT
|PARTITIONED|
--
ONE_TO_ONE_EXCHANGE |PARTITIONED|
--
HYBRID_HASH_JOIN [$$313, $$315, $$317][$$333, $$334, $$332] |PARTITIONED|
- --
ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ --
HASH_PARTITION_EXCHANGE [$$313, $$315, $$317] |PARTITIONED|
--
STREAM_PROJECT |PARTITIONED|
--
ONE_TO_ONE_EXCHANGE |PARTITIONED|
--
HYBRID_HASH_JOIN [$$306][$$324] |PARTITIONED|
- --
ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ --
HASH_PARTITION_EXCHANGE [$$306] |PARTITIONED|
--
STREAM_PROJECT |PARTITIONED|
--
ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- HYBRID_HASH_JOIN [$$296, $$295][$$306, $$336] |PARTITIONED|
@@ -68,7 +68,7 @@
-- DATASOURCE_SCAN (test.orders) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- --
BROADCAST_EXCHANGE |PARTITIONED|
+ --
HASH_PARTITION_EXCHANGE [$$324] |PARTITIONED|
--
STREAM_PROJECT |PARTITIONED|
--
STREAM_SELECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
@@ -77,7 +77,7 @@
-- DATASOURCE_SCAN (test.item) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- --
BROADCAST_EXCHANGE |PARTITIONED|
+ --
HASH_PARTITION_EXCHANGE [$$333, $$334, $$332] |PARTITIONED|
--
STREAM_PROJECT |PARTITIONED|
-- ASSIGN
|PARTITIONED|
--
STREAM_PROJECT |PARTITIONED|
@@ -85,7 +85,7 @@
--
DATASOURCE_SCAN (test.customer) |PARTITIONED|
--
ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- BROADCAST_EXCHANGE
|PARTITIONED|
+ --
HASH_PARTITION_EXCHANGE [$$331] |PARTITIONED|
-- STREAM_PROJECT
|PARTITIONED|
-- ASSIGN
|PARTITIONED|
--
ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -96,7 +96,7 @@
--
DATASOURCE_SCAN (test.nation) |PARTITIONED|
--
ONE_TO_ONE_EXCHANGE |PARTITIONED|
--
EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- BROADCAST_EXCHANGE
|PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE
[$$309] |PARTITIONED|
-- STREAM_PROJECT
|PARTITIONED|
-- STREAM_SELECT
|PARTITIONED|
-- ASSIGN |PARTITIONED|
@@ -105,7 +105,7 @@
-- DATASOURCE_SCAN
(test.region) |PARTITIONED|
--
ONE_TO_ONE_EXCHANGE |PARTITIONED|
--
EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- BROADCAST_EXCHANGE |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$341]
|PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
diff --git
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q9.plan
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q9.plan
index 60694553e0..7283aa08f5 100644
---
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q9.plan
+++
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q9.plan
@@ -24,13 +24,13 @@
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- HYBRID_HASH_JOIN [$$228][$$224]
|PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$228]
|PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
-- HYBRID_HASH_JOIN
[$$206][$$207] |PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE
[$$206] |PARTITIONED|
-- STREAM_PROJECT
|PARTITIONED|
-- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
-- HYBRID_HASH_JOIN
[$$200, $$199][$$206, $$217] |PARTITIONED|
@@ -54,7 +54,7 @@
--
DATASOURCE_SCAN (test.orders) |PARTITIONED|
--
ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- BROADCAST_EXCHANGE
|PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE
[$$207] |PARTITIONED|
-- STREAM_PROJECT
|PARTITIONED|
-- STREAM_SELECT
|PARTITIONED|
-- ASSIGN |PARTITIONED|
@@ -63,7 +63,7 @@
-- DATASOURCE_SCAN
(test.item) |PARTITIONED|
--
ONE_TO_ONE_EXCHANGE |PARTITIONED|
--
EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- BROADCAST_EXCHANGE |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$224]
|PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|