[ASTERIXDB-3558][COMP] Allow Cartesian products at all levels if outer joins are present
Ext-Ref: 65071
Change-Id: I1adb17bbf4348d8b495f88eb452cdcd18575f765
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/19377
Reviewed-by: <murali.krishna@couchbase.com>
Reviewed-by: Vijay Sarathy <vijay.sarathy@couchbase.com>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
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 bc4709e..edd4301 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
@@ -1333,7 +1333,8 @@
List<Integer> newJoinConditions = this.getNewJoinConditionsOnly(); // these will be a subset of applicable join conditions.
if ((newJoinConditions.size() == 0) && joinEnum.connectedJoinGraph) {
// at least one plan must be there at each level as the graph is fully connected.
- if (leftJn.cardinality * rightJn.cardinality > 10000.0 && level > joinEnum.cboFullEnumLevel) {
+ if (leftJn.cardinality * rightJn.cardinality > 10000.0 && level > joinEnum.cboFullEnumLevel
+ && !joinEnum.outerJoin) { // when outer joins are present, moving joins around is restricted
return;
}
}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/tpch/query-plans/query-plans.04.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/tpch/query-plans/query-plans.04.plan
index 66fe341..d2c7c52 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/tpch/query-plans/query-plans.04.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/tpch/query-plans/query-plans.04.plan
@@ -38,159 +38,137 @@
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
join (and(eq($$250, $$203), eq($$202, $$231))) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- HYBRID_HASH_JOIN [$$250, $$231][$$203, $$202] |PARTITIONED|
- exchange [cardinality: 37.63, op-cost: 0.0, total-cost: 20000.0]
+ exchange [cardinality: 30.16, op-cost: 0.0, total-cost: 264479.97]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- assign [$$231] <- [get-item($$181, 0)] project: [$$250, $$244, $$231] [cardinality: 37.63, op-cost: 0.0, total-cost: 20000.0]
+ assign [$$231] <- [get-item($$181, 0)] project: [$$250, $$244, $$231] [cardinality: 30.16, op-cost: 0.0, total-cost: 264479.97]
-- ASSIGN |PARTITIONED|
- exchange [cardinality: 37.63, op-cost: 0.0, total-cost: 20000.0]
+ exchange [cardinality: 30.16, op-cost: 0.0, total-cost: 264479.97]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
group by ([$$250 := $$200]) decor ([$$244]) {
aggregate [$$181] <- [listify($$215)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- AGGREGATE |LOCAL|
aggregate [$$215] <- [agg-sql-min($$208)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- AGGREGATE |LOCAL|
- select (not(is-missing($$249))) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- STREAM_SELECT |LOCAL|
- nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- NESTED_TUPLE_SOURCE |LOCAL|
- } [cardinality: 0.0, op-cost: 0.0, total-cost: 20000.0]
+ nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- NESTED_TUPLE_SOURCE |LOCAL|
+ } [cardinality: 0.0, op-cost: 0.0, total-cost: 264479.97]
-- PRE_CLUSTERED_GROUP_BY[$$200] |PARTITIONED|
- exchange [cardinality: 37.63, op-cost: 0.0, total-cost: 20000.0]
+ exchange [cardinality: 30.16, op-cost: 0.0, total-cost: 264479.97]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- order (ASC, $$200) [cardinality: 37.63, op-cost: 0.0, total-cost: 20000.0]
+ order (ASC, $$200) [cardinality: 30.16, op-cost: 0.0, total-cost: 264479.97]
-- STABLE_SORT [$$200(ASC)] |PARTITIONED|
- exchange [cardinality: 37.63, op-cost: 0.0, total-cost: 20000.0]
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- project ([$$244, $$208, $$249, $$200]) [cardinality: 37.63, op-cost: 0.0, total-cost: 20000.0]
+ exchange [cardinality: 30.16, op-cost: 0.0, total-cost: 264479.97]
+ -- HASH_PARTITION_EXCHANGE [$$200] |PARTITIONED|
+ project ([$$244, $$208, $$200]) [cardinality: 30.16, op-cost: 0.0, total-cost: 264479.97]
-- STREAM_PROJECT |PARTITIONED|
- exchange [cardinality: 37.63, op-cost: 0.0, total-cost: 20000.0]
+ exchange [cardinality: 30.16, op-cost: 0.0, total-cost: 264479.97]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- left outer join (eq($$207, $$200)) [cardinality: 30.16, op-cost: 16067.92, total-cost: 394475.1]
- -- HYBRID_HASH_JOIN [$$200][$$207] |PARTITIONED|
- exchange [cardinality: 37.63, op-cost: 0.0, total-cost: 20000.0]
- -- HASH_PARTITION_EXCHANGE [$$200] |PARTITIONED|
- select (and(eq($$p.getField(5), 37), like($$p.getField(4), "%COPPER"))) project: [$$244, $$200] [cardinality: 37.63, op-cost: 0.0, total-cost: 20000.0]
- -- STREAM_SELECT |PARTITIONED|
- assign [$$244] <- [$$p.getField(2)] [cardinality: 20000.0, op-cost: 0.0, total-cost: 20000.0]
- -- ASSIGN |PARTITIONED|
- exchange [cardinality: 20000.0, op-cost: 0.0, total-cost: 20000.0]
+ join (and(eq($$218, $$213), eq($$223, $$212))) [cardinality: 30.16, op-cost: 250.8, total-cost: 264479.97]
+ -- HYBRID_HASH_JOIN [$$213, $$223][$$218, $$212] |PARTITIONED|
+ exchange [cardinality: 987.0, op-cost: 0.0, total-cost: 1000.0]
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ assign [$$223] <- [$$s2.getField(3)] project: [$$244, $$208, $$200, $$213, $$223] [cardinality: 987.0, op-cost: 0.0, total-cost: 1000.0]
+ -- ASSIGN |PARTITIONED|
+ project ([$$208, $$213, $$244, $$200, $$s2]) [cardinality: 987.0, op-cost: 0.0, total-cost: 1000.0]
+ -- STREAM_PROJECT |PARTITIONED|
+ exchange [cardinality: 987.0, op-cost: 0.0, total-cost: 1000.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- data-scan []<-[$$200, $$p] <- tpch.part [cardinality: 20000.0, op-cost: 20000.0, total-cost: 20000.0]
- -- DATASOURCE_SCAN |PARTITIONED|
+ unnest-map [$$211, $$s2] <- index-search("supplier", 0, "Default", "tpch", "supplier", true, true, 1, $$210, 1, $$210, true, true, true) [cardinality: 987.0, op-cost: 1000.0, total-cost: 1000.0]
+ -- BTREE_SEARCH |PARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- EMPTY_TUPLE_SOURCE |PARTITIONED|
- exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- HASH_PARTITION_EXCHANGE [$$207] |PARTITIONED|
- project ([$$208, $$249, $$207]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- STREAM_PROJECT |PARTITIONED|
- exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- join (eq($$207, $$209)) [cardinality: 16030.29, op-cost: 36033.87, total-cost: 342339.25]
- -- HYBRID_HASH_JOIN [$$209][$$207] |PARTITIONED|
- exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- HASH_PARTITION_EXCHANGE [$$209] |PARTITIONED|
- assign [$$249] <- [true] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- ASSIGN |PARTITIONED|
- project ([$$208, $$209]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- STREAM_PROJECT |PARTITIONED|
+ order (ASC, $$210) [cardinality: 987.0, op-cost: 1000.0, total-cost: 1000.0]
+ -- STABLE_SORT [$$210(ASC)] |PARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- join (eq($$218, $$213)) [cardinality: 16015.05, op-cost: 80079.26, total-cost: 250271.52]
- -- HYBRID_HASH_JOIN [$$218][$$213] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$210] |PARTITIONED|
+ project ([$$208, $$210, $$213, $$244, $$200]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- STREAM_PROJECT |PARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- project ([$$208, $$209, $$218]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- STREAM_PROJECT |PARTITIONED|
+ join (eq($$207, $$209)) [cardinality: 150.8, op-cost: 80225.92, total-cost: 262744.94]
+ -- HYBRID_HASH_JOIN [$$209][$$207] |PARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- join (eq($$211, $$210)) [cardinality: 80075.26, op-cost: 84023.26, total-cost: 170183.26]
- -- HYBRID_HASH_JOIN [$$210][$$211] |PARTITIONED|
- exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ replicate [cardinality: 80000.0, op-cost: 0.0, total-cost: 80000.0]
+ -- REPLICATE |PARTITIONED|
+ exchange [cardinality: 80000.0, op-cost: 0.0, total-cost: 80000.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- replicate [cardinality: 80000.0, op-cost: 0.0, total-cost: 80000.0]
- -- REPLICATE |PARTITIONED|
+ project ([$$208, $$210, $$209]) [cardinality: 80000.0, op-cost: 0.0, total-cost: 80000.0]
+ -- STREAM_PROJECT |PARTITIONED|
exchange [cardinality: 80000.0, op-cost: 0.0, total-cost: 80000.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- project ([$$208, $$209, $$210]) [cardinality: 80000.0, op-cost: 0.0, total-cost: 80000.0]
- -- STREAM_PROJECT |PARTITIONED|
- exchange [cardinality: 80000.0, op-cost: 0.0, total-cost: 80000.0]
+ data-scan []<-[$$208, $$209, $$210, $$ps2] <- tpch.partsupp [cardinality: 80000.0, op-cost: 80000.0, total-cost: 80000.0]
+ -- DATASOURCE_SCAN |PARTITIONED|
+ exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- data-scan []<-[$$208, $$209, $$210, $$ps2] <- tpch.partsupp [cardinality: 80000.0, op-cost: 80000.0, total-cost: 80000.0]
+ empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- BROADCAST_EXCHANGE |PARTITIONED|
+ left outer join (eq($$207, $$200)) [cardinality: 37.67, op-cost: 20169.33, total-cost: 102368.36]
+ -- HYBRID_HASH_JOIN [$$207][$$200] |PARTITIONED|
+ exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ join (true) [cardinality: 20018.81, op-cost: 42039.51, total-cost: 62048.51]
+ -- NESTED_LOOP |PARTITIONED|
+ exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ project ([$$207]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- STREAM_PROJECT |PARTITIONED|
+ exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ data-scan []<-[$$207, $$p2] <- tpch.part [cardinality: 20000.0, op-cost: 20000.0, total-cost: 20000.0]
-- DATASOURCE_SCAN |PARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- BROADCAST_EXCHANGE |PARTITIONED|
+ replicate [cardinality: 1.0, op-cost: 0.0, total-cost: 5.0]
+ -- REPLICATE |PARTITIONED|
+ exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 5.0]
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ select (eq($$r2.getField(1), "EUROPE")) project: [$$213] [cardinality: 1.0, op-cost: 0.0, total-cost: 5.0]
+ -- STREAM_SELECT |PARTITIONED|
+ exchange [cardinality: 5.0, op-cost: 0.0, total-cost: 5.0]
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ data-scan []<-[$$213, $$r2] <- tpch.region [cardinality: 5.0, op-cost: 5.0, total-cost: 5.0]
+ -- DATASOURCE_SCAN |PARTITIONED|
+ exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- BROADCAST_EXCHANGE |PARTITIONED|
- project ([$$218, $$211]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- STREAM_PROJECT |PARTITIONED|
- exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- join (eq($$223, $$212)) [cardinality: 987.0, op-cost: 1087.0, total-cost: 2212.0]
- -- HYBRID_HASH_JOIN [$$223][$$212] |PARTITIONED|
- exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- assign [$$223] <- [$$s2.getField(3)] project: [$$211, $$223] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- ASSIGN |PARTITIONED|
- exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- replicate [cardinality: 1000.0, op-cost: 0.0, total-cost: 1000.0]
- -- REPLICATE |PARTITIONED|
- exchange [cardinality: 1000.0, op-cost: 3948.0, total-cost: 4948.0]
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- data-scan []<-[$$211, $$s2] <- tpch.supplier [cardinality: 1000.0, op-cost: 1000.0, total-cost: 1000.0]
- -- DATASOURCE_SCAN |PARTITIONED|
- exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- EMPTY_TUPLE_SOURCE |PARTITIONED|
- exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- BROADCAST_EXCHANGE |PARTITIONED|
- assign [$$218] <- [$$n2.getField(2)] project: [$$218, $$212] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- ASSIGN |PARTITIONED|
- exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- replicate [cardinality: 25.0, op-cost: 0.0, total-cost: 25.0]
- -- REPLICATE |PARTITIONED|
- exchange [cardinality: 25.0, op-cost: 0.0, total-cost: 25.0]
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- data-scan []<-[$$212, $$n2] <- tpch.nation [cardinality: 25.0, op-cost: 25.0, total-cost: 25.0]
- -- DATASOURCE_SCAN |PARTITIONED|
- exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- EMPTY_TUPLE_SOURCE |PARTITIONED|
- exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- BROADCAST_EXCHANGE |PARTITIONED|
- replicate [cardinality: 1.0, op-cost: 0.0, total-cost: 5.0]
- -- REPLICATE |PARTITIONED|
- exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 5.0]
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- select (eq($$r2.getField(1), "EUROPE")) project: [$$213] [cardinality: 1.0, op-cost: 0.0, total-cost: 5.0]
- -- STREAM_SELECT |PARTITIONED|
- exchange [cardinality: 5.0, op-cost: 0.0, total-cost: 5.0]
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- data-scan []<-[$$213, $$r2] <- tpch.region [cardinality: 5.0, op-cost: 5.0, total-cost: 5.0]
- -- DATASOURCE_SCAN |PARTITIONED|
- exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- EMPTY_TUPLE_SOURCE |PARTITIONED|
- exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- HASH_PARTITION_EXCHANGE [$$207] |PARTITIONED|
- project ([$$207]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- STREAM_PROJECT |PARTITIONED|
+ select (and(eq($$p.getField(5), 37), like($$p.getField(4), "%COPPER"))) project: [$$244, $$200] [cardinality: 37.63, op-cost: 0.0, total-cost: 20000.0]
+ -- STREAM_SELECT |PARTITIONED|
+ assign [$$244] <- [$$p.getField(2)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- ASSIGN |PARTITIONED|
+ exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ data-scan []<-[$$200, $$p] <- tpch.part [cardinality: 20000.0, op-cost: 20000.0, total-cost: 20000.0]
+ -- DATASOURCE_SCAN |PARTITIONED|
+ exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ exchange [cardinality: 25.0, op-cost: 100.0, total-cost: 125.0]
+ -- BROADCAST_EXCHANGE |PARTITIONED|
+ assign [$$218] <- [$$n2.getField(2)] project: [$$218, $$212] [cardinality: 25.0, op-cost: 0.0, total-cost: 25.0]
+ -- ASSIGN |PARTITIONED|
+ exchange [cardinality: 25.0, op-cost: 100.0, total-cost: 125.0]
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ replicate [cardinality: 25.0, op-cost: 0.0, total-cost: 25.0]
+ -- REPLICATE |PARTITIONED|
+ exchange [cardinality: 25.0, op-cost: 0.0, total-cost: 25.0]
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ data-scan []<-[$$212, $$n2] <- tpch.nation [cardinality: 25.0, op-cost: 25.0, total-cost: 25.0]
+ -- DATASOURCE_SCAN |PARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- data-scan []<-[$$207, $$p2] <- tpch.part [cardinality: 20000.0, op-cost: 20000.0, total-cost: 20000.0]
- -- DATASOURCE_SCAN |PARTITIONED|
- exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
exchange [cardinality: 80075.26, op-cost: 0.0, total-cost: 168971.26]
-- HASH_PARTITION_EXCHANGE [$$203] |PARTITIONED|
project ([$$237, $$239, $$245, $$246, $$247, $$225, $$203, $$202]) [cardinality: 80075.26, op-cost: 0.0, total-cost: 168971.26]
@@ -201,7 +179,7 @@
-- HYBRID_HASH_JOIN [$$204][$$201] |PARTITIONED|
exchange [cardinality: 80000.0, op-cost: 0.0, total-cost: 80000.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- assign [$$202, $$203, $$204] <- [$$208, $$209, $$210] project: [$$202, $$203, $$204] [cardinality: 80000.0, op-cost: 0.0, total-cost: 80000.0]
+ assign [$$202, $$204, $$203] <- [$$208, $$210, $$209] project: [$$202, $$204, $$203] [cardinality: 80000.0, op-cost: 0.0, total-cost: 80000.0]
-- ASSIGN |PARTITIONED|
exchange [cardinality: 80000.0, op-cost: 0.0, total-cost: 80000.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -209,7 +187,7 @@
-- REPLICATE |PARTITIONED|
exchange [cardinality: 80000.0, op-cost: 0.0, total-cost: 80000.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- project ([$$208, $$209, $$210]) [cardinality: 80000.0, op-cost: 0.0, total-cost: 80000.0]
+ project ([$$208, $$210, $$209]) [cardinality: 80000.0, op-cost: 0.0, total-cost: 80000.0]
-- STREAM_PROJECT |PARTITIONED|
exchange [cardinality: 80000.0, op-cost: 0.0, total-cost: 80000.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -223,20 +201,14 @@
-- BROADCAST_EXCHANGE |PARTITIONED|
assign [$$247, $$246, $$245, $$237, $$239, $$225] <- [$$s.getField(6), $$s.getField(4), $$s.getField(2), $$s.getField(5), $$s.getField(1), $$s.getField(3)] project: [$$237, $$239, $$245, $$246, $$247, $$225, $$201] [cardinality: 1000.0, op-cost: 0.0, total-cost: 1000.0]
-- ASSIGN |PARTITIONED|
- assign [$$201, $$s] <- [$$211, $$s2] project: [$$201, $$s] [cardinality: 1000.0, op-cost: 0.0, total-cost: 1000.0]
- -- ASSIGN |PARTITIONED|
- exchange [cardinality: 1000.0, op-cost: 3948.0, total-cost: 4948.0]
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- replicate [cardinality: 1000.0, op-cost: 0.0, total-cost: 1000.0]
- -- REPLICATE |PARTITIONED|
- exchange [cardinality: 1000.0, op-cost: 3948.0, total-cost: 4948.0]
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- data-scan []<-[$$211, $$s2] <- tpch.supplier [cardinality: 1000.0, op-cost: 1000.0, total-cost: 1000.0]
- -- DATASOURCE_SCAN |PARTITIONED|
- exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ exchange [cardinality: 1000.0, op-cost: 3948.0, total-cost: 4948.0]
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ data-scan []<-[$$201, $$s] <- tpch.supplier [cardinality: 1000.0, op-cost: 1000.0, total-cost: 1000.0]
+ -- DATASOURCE_SCAN |PARTITIONED|
+ exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
exchange [cardinality: 25.0, op-cost: 0.0, total-cost: 25.0]
-- HASH_PARTITION_EXCHANGE [$$205] |PARTITIONED|
assign [$$238, $$221] <- [$$n.getField(1), $$n.getField(2)] project: [$$238, $$221, $$205] [cardinality: 25.0, op-cost: 0.0, total-cost: 25.0]