[ASTERIXDB-3399][COMP] Nested Loops index joins costing
Change-Id: I44740b77b88bc4c8b440d02162318113642cb880
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18320
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Vijay Sarathy <vijay.sarathy@couchbase.com>
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 d5743e4..e868fa3 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
@@ -672,7 +672,11 @@
// dataCost (0) will contain the dataScan cost with the first index
//dataCost (1) will contain the dataScan cost with the first index and the 2nd index and so on.
sel *= optionalIndexesInfo.get(i).second; // assuming selectivities are independent for now
- dataCosts.add(joinEnum.getCostMethodsHandle().costIndexDataScan(this, sel)); // D0; D01; D012; ...
+ if (optionalIndexesInfo.get(i).first.isPrimaryIndex()) {
+ dataCosts.add(joinEnum.getCostHandle().zeroCost());
+ } else {
+ dataCosts.add(joinEnum.getCostMethodsHandle().costIndexDataScan(this, sel)); // D0; D01; D012; ...
+ }
}
// At the of of the above loop, I0, I1, I2 ... have been computed
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.3.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.3.plan
index c86ab50..8a6990c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.3.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.3.plan
@@ -1,46 +1,46 @@
-distribute result [$$48] [cardinality: 100.0, op-cost: 0.0, total-cost: 4497.18]
+distribute result [$$48] [cardinality: 100.0, op-cost: 0.0, total-cost: 4495.77]
-- DISTRIBUTE_RESULT |PARTITIONED|
- exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 4497.18]
+ exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 4495.77]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- project ([$$48]) [cardinality: 100.0, op-cost: 0.0, total-cost: 4497.18]
+ project ([$$48]) [cardinality: 100.0, op-cost: 0.0, total-cost: 4495.77]
-- STREAM_PROJECT |PARTITIONED|
- assign [$$48] <- [{"$1": $$51}] [cardinality: 100.0, op-cost: 0.0, total-cost: 4497.18]
+ assign [$$48] <- [{"$1": $$51}] [cardinality: 100.0, op-cost: 0.0, total-cost: 4495.77]
-- ASSIGN |PARTITIONED|
- project ([$$51]) [cardinality: 100.0, op-cost: 0.0, total-cost: 4497.18]
+ project ([$$51]) [cardinality: 100.0, op-cost: 0.0, total-cost: 4495.77]
-- STREAM_PROJECT |PARTITIONED|
- exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 4497.18]
+ exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 4495.77]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
group by ([$$o_custkey := $$54]) decor ([]) {
aggregate [$$51] <- [sql-sum-serial($$53)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- AGGREGATE |LOCAL|
nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- NESTED_TUPLE_SOURCE |LOCAL|
- } [cardinality: 100.0, op-cost: 1498.59, total-cost: 4497.18]
+ } [cardinality: 100.0, op-cost: 1498.59, total-cost: 4495.77]
-- EXTERNAL_GROUP_BY[$$54] |PARTITIONED|
- exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 2998.59]
+ exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 2997.18]
-- HASH_PARTITION_EXCHANGE [$$54] |PARTITIONED|
group by ([$$54 := $$49]) decor ([]) {
aggregate [$$53] <- [sql-count-serial(1)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- AGGREGATE |LOCAL|
nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- NESTED_TUPLE_SOURCE |LOCAL|
- } [cardinality: 100.0, op-cost: 1498.59, total-cost: 2998.59]
+ } [cardinality: 100.0, op-cost: 1498.59, total-cost: 2997.18]
-- EXTERNAL_GROUP_BY[$$49] |PARTITIONED|
- exchange [cardinality: 1498.59, op-cost: 0.0, total-cost: 1500.0]
+ exchange [cardinality: 1498.59, op-cost: 0.0, total-cost: 1498.59]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- project ([$$49]) [cardinality: 1498.59, op-cost: 0.0, total-cost: 1500.0]
+ project ([$$49]) [cardinality: 1498.59, op-cost: 0.0, total-cost: 1498.59]
-- STREAM_PROJECT |PARTITIONED|
- assign [$$49] <- [$$o.getField(1)] [cardinality: 1498.59, op-cost: 0.0, total-cost: 1500.0]
+ assign [$$49] <- [$$o.getField(1)] [cardinality: 1498.59, op-cost: 0.0, total-cost: 1498.59]
-- ASSIGN |PARTITIONED|
- project ([$$o]) [cardinality: 1498.59, op-cost: 0.0, total-cost: 1500.0]
+ project ([$$o]) [cardinality: 1498.59, op-cost: 0.0, total-cost: 1498.59]
-- STREAM_PROJECT |PARTITIONED|
- exchange [cardinality: 1498.59, op-cost: 0.0, total-cost: 1500.0]
+ exchange [cardinality: 1498.59, op-cost: 0.0, total-cost: 1498.59]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- unnest-map [$$50, $$o] <- index-search("Orders", 0, "Default", "tpch", "Orders", false, false, 1, $$55, 0, false, true, false) [cardinality: 1498.59, op-cost: 1500.0, total-cost: 1500.0]
+ unnest-map [$$50, $$o] <- index-search("Orders", 0, "Default", "tpch", "Orders", false, false, 1, $$55, 0, false, true, false) [cardinality: 1498.59, op-cost: 1498.59, total-cost: 1498.59]
-- BTREE_SEARCH |PARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
assign [$$55] <- [2] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ASSIGN |PARTITIONED|
empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- EMPTY_TUPLE_SOURCE |PARTITIONED|
\ No newline at end of file
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.4.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.4.plan
index 46521c5..6ea6385 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.4.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.4.plan
@@ -1,42 +1,42 @@
-distribute result [$$48] [cardinality: 1495.77, op-cost: 0.0, total-cost: 4491.54]
+distribute result [$$48] [cardinality: 1495.77, op-cost: 0.0, total-cost: 4487.31]
-- DISTRIBUTE_RESULT |PARTITIONED|
- exchange [cardinality: 1495.77, op-cost: 0.0, total-cost: 4491.54]
+ exchange [cardinality: 1495.77, op-cost: 0.0, total-cost: 4487.31]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- project ([$$48]) [cardinality: 1495.77, op-cost: 0.0, total-cost: 4491.54]
+ project ([$$48]) [cardinality: 1495.77, op-cost: 0.0, total-cost: 4487.31]
-- STREAM_PROJECT |PARTITIONED|
- assign [$$48] <- [{"$1": $$51}] [cardinality: 1495.77, op-cost: 0.0, total-cost: 4491.54]
+ assign [$$48] <- [{"$1": $$51}] [cardinality: 1495.77, op-cost: 0.0, total-cost: 4487.31]
-- ASSIGN |PARTITIONED|
- project ([$$51]) [cardinality: 1495.77, op-cost: 0.0, total-cost: 4491.54]
+ project ([$$51]) [cardinality: 1495.77, op-cost: 0.0, total-cost: 4487.31]
-- STREAM_PROJECT |PARTITIONED|
- exchange [cardinality: 1495.77, op-cost: 0.0, total-cost: 4491.54]
+ exchange [cardinality: 1495.77, op-cost: 0.0, total-cost: 4487.31]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
group by ([$$o_orderdate := $$54]) decor ([]) {
aggregate [$$51] <- [sql-sum-serial($$53)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- AGGREGATE |LOCAL|
nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- NESTED_TUPLE_SOURCE |LOCAL|
- } [cardinality: 1495.77, op-cost: 1495.77, total-cost: 4491.54]
+ } [cardinality: 1495.77, op-cost: 1495.77, total-cost: 4487.31]
-- EXTERNAL_GROUP_BY[$$54] |PARTITIONED|
- exchange [cardinality: 1495.77, op-cost: 0.0, total-cost: 2995.77]
+ exchange [cardinality: 1495.77, op-cost: 0.0, total-cost: 2991.54]
-- HASH_PARTITION_EXCHANGE [$$54] |PARTITIONED|
group by ([$$54 := $$49]) decor ([]) {
aggregate [$$53] <- [sql-count-serial(1)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- AGGREGATE |LOCAL|
nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- NESTED_TUPLE_SOURCE |LOCAL|
- } [cardinality: 1495.77, op-cost: 1495.77, total-cost: 2995.77]
+ } [cardinality: 1495.77, op-cost: 1495.77, total-cost: 2991.54]
-- EXTERNAL_GROUP_BY[$$49] |PARTITIONED|
- exchange [cardinality: 1495.77, op-cost: 0.0, total-cost: 1500.0]
+ exchange [cardinality: 1495.77, op-cost: 0.0, total-cost: 1495.77]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- project ([$$49]) [cardinality: 1495.77, op-cost: 0.0, total-cost: 1500.0]
+ project ([$$49]) [cardinality: 1495.77, op-cost: 0.0, total-cost: 1495.77]
-- STREAM_PROJECT |PARTITIONED|
- assign [$$49] <- [$$o.getField(4)] [cardinality: 1495.77, op-cost: 0.0, total-cost: 1500.0]
+ assign [$$49] <- [$$o.getField(4)] [cardinality: 1495.77, op-cost: 0.0, total-cost: 1495.77]
-- ASSIGN |PARTITIONED|
- project ([$$o]) [cardinality: 1495.77, op-cost: 0.0, total-cost: 1500.0]
+ project ([$$o]) [cardinality: 1495.77, op-cost: 0.0, total-cost: 1495.77]
-- STREAM_PROJECT |PARTITIONED|
- exchange [cardinality: 1495.77, op-cost: 0.0, total-cost: 1500.0]
+ exchange [cardinality: 1495.77, op-cost: 0.0, total-cost: 1495.77]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- unnest-map [$$50, $$o] <- index-search("Orders", 0, "Default", "tpch", "Orders", false, false, 1, $$55, 0, false, true, false) [cardinality: 1495.77, op-cost: 1500.0, total-cost: 1500.0]
+ unnest-map [$$50, $$o] <- index-search("Orders", 0, "Default", "tpch", "Orders", false, false, 1, $$55, 0, false, true, false) [cardinality: 1495.77, op-cost: 1495.77, total-cost: 1495.77]
-- BTREE_SEARCH |PARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.7.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.7.plan
index f192363..7eb0d3f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.7.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.7.plan
@@ -1,48 +1,48 @@
-distribute result [$$51] [cardinality: 191.0, op-cost: 0.0, total-cost: 8648.78]
+distribute result [$$51] [cardinality: 191.0, op-cost: 0.0, total-cost: 3965.67]
-- DISTRIBUTE_RESULT |PARTITIONED|
- exchange [cardinality: 191.0, op-cost: 0.0, total-cost: 8648.78]
+ exchange [cardinality: 191.0, op-cost: 0.0, total-cost: 3965.67]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- project ([$$51]) [cardinality: 191.0, op-cost: 0.0, total-cost: 8648.78]
+ project ([$$51]) [cardinality: 191.0, op-cost: 0.0, total-cost: 3965.67]
-- STREAM_PROJECT |PARTITIONED|
- assign [$$51] <- [{"$1": $$55}] [cardinality: 191.0, op-cost: 0.0, total-cost: 8648.78]
+ assign [$$51] <- [{"$1": $$55}] [cardinality: 191.0, op-cost: 0.0, total-cost: 3965.67]
-- ASSIGN |PARTITIONED|
- project ([$$55]) [cardinality: 191.0, op-cost: 0.0, total-cost: 8648.78]
+ project ([$$55]) [cardinality: 191.0, op-cost: 0.0, total-cost: 3965.67]
-- STREAM_PROJECT |PARTITIONED|
- exchange [cardinality: 191.0, op-cost: 0.0, total-cost: 8648.78]
+ exchange [cardinality: 191.0, op-cost: 0.0, total-cost: 3965.67]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
group by ([$$l_partkey := $$59]) decor ([]) {
aggregate [$$55] <- [sql-sum-serial($$58)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- AGGREGATE |LOCAL|
nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- NESTED_TUPLE_SOURCE |LOCAL|
- } [cardinality: 191.0, op-cost: 1321.89, total-cost: 8648.78]
+ } [cardinality: 191.0, op-cost: 1321.89, total-cost: 3965.67]
-- EXTERNAL_GROUP_BY[$$59] |PARTITIONED|
- exchange [cardinality: 191.0, op-cost: 0.0, total-cost: 7326.89]
+ exchange [cardinality: 191.0, op-cost: 0.0, total-cost: 2643.78]
-- HASH_PARTITION_EXCHANGE [$$59] |PARTITIONED|
group by ([$$59 := $$52]) decor ([]) {
aggregate [$$58] <- [sql-count-serial(1)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- AGGREGATE |LOCAL|
nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- NESTED_TUPLE_SOURCE |LOCAL|
- } [cardinality: 191.0, op-cost: 1321.89, total-cost: 7326.89]
+ } [cardinality: 191.0, op-cost: 1321.89, total-cost: 2643.78]
-- EXTERNAL_GROUP_BY[$$52] |PARTITIONED|
- exchange [cardinality: 1321.89, op-cost: 0.0, total-cost: 6005.0]
+ exchange [cardinality: 1321.89, op-cost: 0.0, total-cost: 1321.89]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- project ([$$52]) [cardinality: 1321.89, op-cost: 0.0, total-cost: 6005.0]
+ project ([$$52]) [cardinality: 1321.89, op-cost: 0.0, total-cost: 1321.89]
-- STREAM_PROJECT |PARTITIONED|
- select (and(gt($$53, 1), gt($$54, 4))) [cardinality: 1321.89, op-cost: 0.0, total-cost: 6005.0]
+ select (and(gt($$53, 1), gt($$54, 4))) [cardinality: 1321.89, op-cost: 0.0, total-cost: 1321.89]
-- STREAM_SELECT |PARTITIONED|
- project ([$$53, $$54, $$52]) [cardinality: 1321.89, op-cost: 0.0, total-cost: 6005.0]
+ project ([$$53, $$54, $$52]) [cardinality: 1321.89, op-cost: 0.0, total-cost: 1321.89]
-- STREAM_PROJECT |PARTITIONED|
- assign [$$52] <- [$$l.getField(1)] [cardinality: 1321.89, op-cost: 0.0, total-cost: 6005.0]
+ assign [$$52] <- [$$l.getField(1)] [cardinality: 1321.89, op-cost: 0.0, total-cost: 1321.89]
-- ASSIGN |PARTITIONED|
- exchange [cardinality: 1321.89, op-cost: 0.0, total-cost: 6005.0]
+ exchange [cardinality: 1321.89, op-cost: 0.0, total-cost: 1321.89]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- unnest-map [$$53, $$54, $$l] <- index-search("LineItem", 0, "Default", "tpch", "LineItem", false, false, 2, $$60, $$61, 0, true, true, false) [cardinality: 1321.89, op-cost: 6005.0, total-cost: 6005.0]
+ unnest-map [$$53, $$54, $$l] <- index-search("LineItem", 0, "Default", "tpch", "LineItem", false, false, 2, $$60, $$61, 0, true, true, false) [cardinality: 1321.89, op-cost: 1321.89, total-cost: 1321.89]
-- BTREE_SEARCH |PARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
assign [$$60, $$61] <- [1, 4] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ASSIGN |PARTITIONED|
empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- EMPTY_TUPLE_SOURCE |PARTITIONED|
\ No newline at end of file
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|