You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@impala.apache.org by ta...@apache.org on 2020/08/31 18:34:27 UTC

[impala] 03/03: IMPALA-10099: Push down DISTINCT in Set operations

This is an automated email from the ASF dual-hosted git repository.

tarmstrong pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/impala.git

commit 827070b473c02da480f3a9d77c59f7031f9070c2
Author: Shant Hovsepian <sh...@cloudera.com>
AuthorDate: Fri Aug 21 23:39:20 2020 -0400

    IMPALA-10099: Push down DISTINCT in Set operations
    
    INTERSECT/EXCEPT are not duplicate preserving operations. The distinct
    aggregations can happen in each operand, the leftmost operand only, or
    after all the operands in a separate aggregation step. Except for a
    couple special cases we would use the last strategy most often.
    
    This change pushes the distinct aggregation down to the leftmost operand
    in cases where there are no analytic functions, or when a distinct or
    grouping operation already eliminates duplicates.
    
    In general DISTINCT placement such as in this case should be done
    throughout the entire plan tree in a cost based manner as described in
    IMPALA-5260
    
    Testing:
     * TpcdsPlannerTest
     * PlannerTest
     * TPC-DS 30TB Perf run for any affected queries
       - Q14-1 180s -> 150s
       - Q14-2 109s -> 90s
       - Q8 no significant change
     * SetOperation Planner Tests
     * Analyzer tests
     * Tpcds Functional Workload
    
    Change-Id: Ia248f1595df2ab48fbe70c778c7c32bde5c518a5
    Reviewed-on: http://gerrit.cloudera.org:8080/16350
    Tested-by: Impala Public Jenkins <im...@cloudera.com>
    Reviewed-by: Tim Armstrong <ta...@cloudera.com>
---
 .../org/apache/impala/analysis/StmtRewriter.java   |   25 +-
 .../queries/PlannerTest/empty.test                 |   36 +-
 .../queries/PlannerTest/setoperation-rewrite.test  |  739 ++++++---
 .../queries/PlannerTest/tpcds/tpcds-q08.test       |  347 ++---
 .../queries/PlannerTest/tpcds/tpcds-q14a.test      | 1602 ++++++++++----------
 .../queries/PlannerTest/tpcds/tpcds-q14b.test      | 1068 ++++++-------
 6 files changed, 2030 insertions(+), 1787 deletions(-)

diff --git a/fe/src/main/java/org/apache/impala/analysis/StmtRewriter.java b/fe/src/main/java/org/apache/impala/analysis/StmtRewriter.java
index 705eb07..b8099ad 100644
--- a/fe/src/main/java/org/apache/impala/analysis/StmtRewriter.java
+++ b/fe/src/main/java/org/apache/impala/analysis/StmtRewriter.java
@@ -232,24 +232,37 @@ public class StmtRewriter {
         case EXCEPT:
         case INTERSECT:
           if (eiSelect == null) {
-            // For a new SelectStmt the left most tableref will either by the first
+            // For a new SelectStmt the left most tableref will either be the first
             // operand or a the SelectStmt from the union operands.
             InlineViewRef leftMostView = null;
             SelectList sl =
                 new SelectList(Lists.newArrayList(SelectListItem.createStarItem(null)));
             // Intersect/Except have set semantics in SQL they must not return duplicates
-            // As an optimization if the leftmost operand is already distinct we remove
-            // the distinct here.
+            // As an optimization we push this distinct down into the first operand if
+            // it's not a UNION and has no other aggregations.
             // This would be best done in a cost based manner during planning.
             sl.setIsDistinct(true);
             eiSelect = new SelectStmt(sl, null, null, null, null, null, null);
 
             if (i == 1) {
               if (firstOperand.getQueryStmt() instanceof SelectStmt) {
-                // optimize out the distinct aggregation in the outer query
-                if (((SelectStmt) firstOperand.getQueryStmt()).getSelectList()
-                    .isDistinct()) {
+                // push down the distinct aggregation if the first operand isn't a UNION
+                // there are no window functions, and we determine the results exprs
+                // already produce distinct results.
+                SelectStmt firstOpStmt = (SelectStmt) firstOperand.getQueryStmt();
+                // DISTINCT is already set
+                if (firstOpStmt.getSelectList().isDistinct()) {
                   sl.setIsDistinct(false);
+                } else {
+                  // Must not have window functions
+                  if (firstOpStmt.getTableRefs().size() > 0
+                      && !firstOpStmt.hasAnalyticInfo()) {
+                    // Add distinct if there isn't any other grouping
+                    if (!firstOpStmt.hasMultiAggInfo()) {
+                      firstOpStmt.getSelectList().setIsDistinct(true);
+                    }
+                    sl.setIsDistinct(false);
+                  }
                 }
               }
               leftMostView = new InlineViewRef(tableAliasGenerator.getNextAlias(),
diff --git a/testdata/workloads/functional-planner/queries/PlannerTest/empty.test b/testdata/workloads/functional-planner/queries/PlannerTest/empty.test
index e6cd733..b03ab5a 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/empty.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/empty.test
@@ -556,7 +556,7 @@ PLAN-ROOT SINK
 |  03:EMPTYSET
 |
 00:SCAN HDFS [tpch_nested_parquet.customer c]
-   HDFS partitions=1/1 files=4 size=289.01MB
+   HDFS partitions=1/1 files=4 size=289.06MB
    predicates: c_custkey < 10
    row-size=56B cardinality=15.00K
 ====
@@ -598,7 +598,7 @@ PLAN-ROOT SINK
 |     row-size=8B cardinality=10
 |
 00:SCAN HDFS [tpch_nested_parquet.customer c]
-   HDFS partitions=1/1 files=4 size=289.01MB
+   HDFS partitions=1/1 files=4 size=289.06MB
    predicates: c_custkey = 1
    row-size=44B cardinality=1
 ====
@@ -643,20 +643,20 @@ select int_col from functional.alltypes where "abc" = "cde"
 ---- PLAN
 PLAN-ROOT SINK
 |
-03:AGGREGATE [FINALIZE]
-|  group by: int_col
-|  row-size=4B cardinality=0
-|
-02:HASH JOIN [LEFT SEMI JOIN]
+03:HASH JOIN [LEFT SEMI JOIN]
 |  hash predicates: int_col IS NOT DISTINCT FROM int_col
 |  runtime filters: RF000 <- int_col
 |  row-size=4B cardinality=0
 |
-|--01:EMPTYSET
+|--02:EMPTYSET
+|
+01:AGGREGATE [FINALIZE]
+|  group by: int_col
+|  row-size=4B cardinality=10
 |
 00:SCAN HDFS [functional.alltypessmall]
    HDFS partitions=4/4 files=4 size=6.32KB
-   runtime filters: RF000 -> int_col
+   runtime filters: RF000 -> functional.alltypessmall.int_col
    row-size=4B cardinality=100
 ====
 # Improve this so limit 0 removes the entire branch
@@ -668,27 +668,27 @@ select id from functional.alltypestiny where int_col > 0
 ---- PLAN
 PLAN-ROOT SINK
 |
-05:AGGREGATE [FINALIZE]
-|  group by: id
-|  row-size=4B cardinality=0
-|
-04:HASH JOIN [RIGHT ANTI JOIN]
+05:HASH JOIN [RIGHT ANTI JOIN]
 |  hash predicates: id IS NOT DISTINCT FROM id
 |  row-size=4B cardinality=0
 |
-|--03:HASH JOIN [LEFT SEMI JOIN]
+|--04:HASH JOIN [LEFT SEMI JOIN]
 |  |  hash predicates: id IS NOT DISTINCT FROM id
 |  |  runtime filters: RF000 <- id
 |  |  row-size=4B cardinality=0
 |  |
-|  |--01:EMPTYSET
+|  |--02:EMPTYSET
+|  |
+|  01:AGGREGATE [FINALIZE]
+|  |  group by: id
+|  |  row-size=4B cardinality=99
 |  |
 |  00:SCAN HDFS [functional.alltypessmall]
 |     HDFS partitions=4/4 files=4 size=6.32KB
-|     runtime filters: RF000 -> id
+|     runtime filters: RF000 -> functional.alltypessmall.id
 |     row-size=4B cardinality=100
 |
-02:SCAN HDFS [functional.alltypestiny]
+03:SCAN HDFS [functional.alltypestiny]
    HDFS partitions=4/4 files=4 size=460B
    predicates: int_col > 0
    row-size=8B cardinality=1
diff --git a/testdata/workloads/functional-planner/queries/PlannerTest/setoperation-rewrite.test b/testdata/workloads/functional-planner/queries/PlannerTest/setoperation-rewrite.test
index 8bfd42e..91ae2ae 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/setoperation-rewrite.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/setoperation-rewrite.test
@@ -5,69 +5,71 @@ select year, month from functional.alltypes where year=2009
 ---- PLAN
 PLAN-ROOT SINK
 |
-04:AGGREGATE [FINALIZE]
-|  group by: `year`, `month`
-|  row-size=8B cardinality=24
-|
-03:HASH JOIN [LEFT SEMI JOIN]
+04:HASH JOIN [LEFT SEMI JOIN]
 |  hash predicates: `month` IS NOT DISTINCT FROM functional.alltypes.month, `year` IS NOT DISTINCT FROM functional.alltypes.year
 |  runtime filters: RF000 <- functional.alltypes.month, RF001 <- functional.alltypes.year
-|  row-size=8B cardinality=7.30K
+|  row-size=8B cardinality=24
 |
-|--02:AGGREGATE [FINALIZE]
+|--03:AGGREGATE [FINALIZE]
 |  |  group by: functional.alltypes.year, functional.alltypes.month
 |  |  row-size=8B cardinality=24
 |  |
-|  01:SCAN HDFS [functional.alltypes]
+|  02:SCAN HDFS [functional.alltypes]
 |     partition predicates: `year` = 2009
 |     HDFS partitions=12/24 files=12 size=238.68KB
 |     row-size=8B cardinality=3.65K
 |
+01:AGGREGATE [FINALIZE]
+|  group by: `year`, `month`
+|  row-size=8B cardinality=24
+|
 00:SCAN HDFS [functional.alltypes]
    HDFS partitions=24/24 files=24 size=478.45KB
-   runtime filters: RF000 -> `month`, RF001 -> `year`
-   row-size=8B cardinality=7.30K
+   runtime filters: RF000 -> functional.alltypes.month, RF001 -> functional.alltypes.year
+   partition key scan
+   row-size=8B cardinality=24
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 10:EXCHANGE [UNPARTITIONED]
 |
-09:AGGREGATE [FINALIZE]
-|  group by: $a$1.year, $a$1.month
-|  row-size=8B cardinality=24
-|
-08:EXCHANGE [HASH($a$1.year,$a$1.month)]
-|
-04:AGGREGATE [STREAMING]
-|  group by: `year`, `month`
-|  row-size=8B cardinality=24
-|
-03:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+04:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  hash predicates: `month` IS NOT DISTINCT FROM functional.alltypes.month, `year` IS NOT DISTINCT FROM functional.alltypes.year
 |  runtime filters: RF000 <- functional.alltypes.month, RF001 <- functional.alltypes.year
-|  row-size=8B cardinality=7.30K
+|  row-size=8B cardinality=24
 |
-|--07:EXCHANGE [BROADCAST]
+|--09:EXCHANGE [HASH(functional.alltypes.year,functional.alltypes.month)]
 |  |
-|  06:AGGREGATE [FINALIZE]
+|  08:AGGREGATE [FINALIZE]
 |  |  group by: functional.alltypes.year, functional.alltypes.month
 |  |  row-size=8B cardinality=24
 |  |
-|  05:EXCHANGE [HASH(functional.alltypes.year,functional.alltypes.month)]
+|  07:EXCHANGE [HASH(functional.alltypes.year,functional.alltypes.month)]
 |  |
-|  02:AGGREGATE [STREAMING]
+|  03:AGGREGATE [STREAMING]
 |  |  group by: functional.alltypes.year, functional.alltypes.month
 |  |  row-size=8B cardinality=24
 |  |
-|  01:SCAN HDFS [functional.alltypes]
+|  02:SCAN HDFS [functional.alltypes]
 |     partition predicates: `year` = 2009
 |     HDFS partitions=12/24 files=12 size=238.68KB
 |     row-size=8B cardinality=3.65K
 |
+06:AGGREGATE [FINALIZE]
+|  group by: `year`, `month`
+|  row-size=8B cardinality=24
+|
+05:EXCHANGE [HASH(`year`,`month`)]
+|
+01:AGGREGATE [STREAMING]
+|  group by: `year`, `month`
+|  row-size=8B cardinality=24
+|
 00:SCAN HDFS [functional.alltypes]
    HDFS partitions=24/24 files=24 size=478.45KB
-   runtime filters: RF000 -> `month`, RF001 -> `year`
-   row-size=8B cardinality=7.30K
+   runtime filters: RF000 -> functional.alltypes.month, RF001 -> functional.alltypes.year
+   partition key scan
+   row-size=8B cardinality=24
 ====
 # intersect unnesting
 select id, year, month from functional.alltypestiny where year=2009 and month=1
@@ -80,132 +82,132 @@ intersect
 ---- PLAN
 PLAN-ROOT SINK
 |
-09:AGGREGATE [FINALIZE]
-|  group by: id, `year`, `month`
-|  row-size=12B cardinality=2
-|
-08:HASH JOIN [LEFT SEMI JOIN]
-|  hash predicates: `month` IS NOT DISTINCT FROM $a$1.month, `year` IS NOT DISTINCT FROM $a$1.year, id IS NOT DISTINCT FROM $a$1.id
-|  runtime filters: RF000 <- $a$1.month, RF001 <- $a$1.year, RF002 <- $a$1.id
+09:HASH JOIN [LEFT SEMI JOIN]
+|  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
+|  runtime filters: RF000 <- `month`, RF001 <- `year`, RF002 <- id
 |  row-size=12B cardinality=2
 |
-|--07:AGGREGATE [FINALIZE]
-|  |  group by: id, `year`, `month`
-|  |  row-size=12B cardinality=2
-|  |
-|  06:HASH JOIN [LEFT SEMI JOIN]
-|  |  hash predicates: `month` IS NOT DISTINCT FROM $a$1.month, `year` IS NOT DISTINCT FROM $a$1.year, id IS NOT DISTINCT FROM $a$1.id
-|  |  runtime filters: RF006 <- $a$1.month, RF007 <- $a$1.year, RF008 <- $a$1.id
+|--08:HASH JOIN [LEFT SEMI JOIN]
+|  |  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
+|  |  runtime filters: RF006 <- `month`, RF007 <- `year`, RF008 <- id
 |  |  row-size=12B cardinality=2
 |  |
-|  |--05:AGGREGATE [FINALIZE]
-|  |  |  group by: id, `year`, `month`
-|  |  |  row-size=12B cardinality=2
-|  |  |
-|  |  04:HASH JOIN [LEFT SEMI JOIN]
+|  |--07:HASH JOIN [LEFT SEMI JOIN]
 |  |  |  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
 |  |  |  runtime filters: RF012 <- `month`, RF013 <- `year`, RF014 <- id
 |  |  |  row-size=12B cardinality=2
 |  |  |
-|  |  |--03:SCAN HDFS [functional.alltypestiny]
+|  |  |--06:SCAN HDFS [functional.alltypestiny]
 |  |  |     partition predicates: `year` = 2009, `month` = 2
 |  |  |     HDFS partitions=1/4 files=1 size=115B
 |  |  |     row-size=12B cardinality=2
 |  |  |
-|  |  02:SCAN HDFS [functional.alltypestiny]
+|  |  05:AGGREGATE [FINALIZE]
+|  |  |  group by: id, `year`, `month`
+|  |  |  row-size=12B cardinality=2
+|  |  |
+|  |  04:SCAN HDFS [functional.alltypestiny]
 |  |     partition predicates: `year` = 2009, `month` = 2
 |  |     HDFS partitions=1/4 files=1 size=115B
-|  |     runtime filters: RF012 -> `month`, RF013 -> `year`, RF014 -> id
+|  |     runtime filters: RF012 -> functional.alltypestiny.month, RF013 -> functional.alltypestiny.year, RF014 -> functional.alltypestiny.id
 |  |     row-size=12B cardinality=2
 |  |
-|  01:SCAN HDFS [functional.alltypestiny]
+|  03:AGGREGATE [FINALIZE]
+|  |  group by: id, `year`, `month`
+|  |  row-size=12B cardinality=2
+|  |
+|  02:SCAN HDFS [functional.alltypestiny]
 |     partition predicates: `year` = 2009, `month` = 1
 |     HDFS partitions=1/4 files=1 size=115B
-|     runtime filters: RF006 -> `month`, RF007 -> `year`, RF008 -> id
+|     runtime filters: RF006 -> functional.alltypestiny.month, RF007 -> functional.alltypestiny.year, RF008 -> functional.alltypestiny.id
 |     row-size=12B cardinality=2
 |
+01:AGGREGATE [FINALIZE]
+|  group by: id, `year`, `month`
+|  row-size=12B cardinality=2
+|
 00:SCAN HDFS [functional.alltypestiny]
    partition predicates: `year` = 2009, `month` = 1
    HDFS partitions=1/4 files=1 size=115B
-   runtime filters: RF000 -> `month`, RF001 -> `year`, RF002 -> id
+   runtime filters: RF000 -> functional.alltypestiny.month, RF001 -> functional.alltypestiny.year, RF002 -> functional.alltypestiny.id
    row-size=12B cardinality=2
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 19:EXCHANGE [UNPARTITIONED]
 |
-18:AGGREGATE [FINALIZE]
-|  group by: $a$1.id, $a$1.year, $a$1.month
-|  row-size=12B cardinality=2
-|
-17:EXCHANGE [HASH($a$1.id,$a$1.year,$a$1.month)]
-|
-09:AGGREGATE [STREAMING]
-|  group by: id, `year`, `month`
-|  row-size=12B cardinality=2
-|
-08:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
-|  hash predicates: `month` IS NOT DISTINCT FROM $a$1.month, `year` IS NOT DISTINCT FROM $a$1.year, id IS NOT DISTINCT FROM $a$1.id
-|  runtime filters: RF000 <- $a$1.month, RF001 <- $a$1.year, RF002 <- $a$1.id
+09:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
+|  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
+|  runtime filters: RF000 <- `month`, RF001 <- `year`, RF002 <- id
 |  row-size=12B cardinality=2
 |
-|--16:EXCHANGE [BROADCAST]
-|  |
-|  15:AGGREGATE [FINALIZE]
-|  |  group by: $a$1.id, $a$1.year, $a$1.month
-|  |  row-size=12B cardinality=2
-|  |
-|  14:EXCHANGE [HASH($a$1.id,$a$1.year,$a$1.month)]
+|--18:EXCHANGE [HASH(id,`year`,`month`)]
 |  |
-|  07:AGGREGATE [STREAMING]
-|  |  group by: id, `year`, `month`
-|  |  row-size=12B cardinality=2
-|  |
-|  06:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
-|  |  hash predicates: `month` IS NOT DISTINCT FROM $a$1.month, `year` IS NOT DISTINCT FROM $a$1.year, id IS NOT DISTINCT FROM $a$1.id
-|  |  runtime filters: RF006 <- $a$1.month, RF007 <- $a$1.year, RF008 <- $a$1.id
+|  08:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
+|  |  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
+|  |  runtime filters: RF006 <- `month`, RF007 <- `year`, RF008 <- id
 |  |  row-size=12B cardinality=2
 |  |
-|  |--13:EXCHANGE [BROADCAST]
-|  |  |
-|  |  12:AGGREGATE [FINALIZE]
-|  |  |  group by: $a$1.id, $a$1.year, $a$1.month
-|  |  |  row-size=12B cardinality=2
+|  |--17:EXCHANGE [HASH(id,`year`,`month`)]
 |  |  |
-|  |  11:EXCHANGE [HASH($a$1.id,$a$1.year,$a$1.month)]
-|  |  |
-|  |  05:AGGREGATE [STREAMING]
-|  |  |  group by: id, `year`, `month`
-|  |  |  row-size=12B cardinality=2
-|  |  |
-|  |  04:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  07:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
 |  |  |  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
 |  |  |  runtime filters: RF012 <- `month`, RF013 <- `year`, RF014 <- id
 |  |  |  row-size=12B cardinality=2
 |  |  |
-|  |  |--10:EXCHANGE [BROADCAST]
+|  |  |--16:EXCHANGE [BROADCAST]
 |  |  |  |
-|  |  |  03:SCAN HDFS [functional.alltypestiny]
+|  |  |  06:SCAN HDFS [functional.alltypestiny]
 |  |  |     partition predicates: `year` = 2009, `month` = 2
 |  |  |     HDFS partitions=1/4 files=1 size=115B
 |  |  |     row-size=12B cardinality=2
 |  |  |
-|  |  02:SCAN HDFS [functional.alltypestiny]
+|  |  15:AGGREGATE [FINALIZE]
+|  |  |  group by: id, `year`, `month`
+|  |  |  row-size=12B cardinality=2
+|  |  |
+|  |  14:EXCHANGE [HASH(id,`year`,`month`)]
+|  |  |
+|  |  05:AGGREGATE [STREAMING]
+|  |  |  group by: id, `year`, `month`
+|  |  |  row-size=12B cardinality=2
+|  |  |
+|  |  04:SCAN HDFS [functional.alltypestiny]
 |  |     partition predicates: `year` = 2009, `month` = 2
 |  |     HDFS partitions=1/4 files=1 size=115B
-|  |     runtime filters: RF012 -> `month`, RF013 -> `year`, RF014 -> id
+|  |     runtime filters: RF012 -> functional.alltypestiny.month, RF013 -> functional.alltypestiny.year, RF014 -> functional.alltypestiny.id
 |  |     row-size=12B cardinality=2
 |  |
-|  01:SCAN HDFS [functional.alltypestiny]
+|  13:AGGREGATE [FINALIZE]
+|  |  group by: id, `year`, `month`
+|  |  row-size=12B cardinality=2
+|  |
+|  12:EXCHANGE [HASH(id,`year`,`month`)]
+|  |
+|  03:AGGREGATE [STREAMING]
+|  |  group by: id, `year`, `month`
+|  |  row-size=12B cardinality=2
+|  |
+|  02:SCAN HDFS [functional.alltypestiny]
 |     partition predicates: `year` = 2009, `month` = 1
 |     HDFS partitions=1/4 files=1 size=115B
-|     runtime filters: RF006 -> `month`, RF007 -> `year`, RF008 -> id
+|     runtime filters: RF006 -> functional.alltypestiny.month, RF007 -> functional.alltypestiny.year, RF008 -> functional.alltypestiny.id
 |     row-size=12B cardinality=2
 |
+11:AGGREGATE [FINALIZE]
+|  group by: id, `year`, `month`
+|  row-size=12B cardinality=2
+|
+10:EXCHANGE [HASH(id,`year`,`month`)]
+|
+01:AGGREGATE [STREAMING]
+|  group by: id, `year`, `month`
+|  row-size=12B cardinality=2
+|
 00:SCAN HDFS [functional.alltypestiny]
    partition predicates: `year` = 2009, `month` = 1
    HDFS partitions=1/4 files=1 size=115B
-   runtime filters: RF000 -> `month`, RF001 -> `year`, RF002 -> id
+   runtime filters: RF000 -> functional.alltypestiny.month, RF001 -> functional.alltypestiny.year, RF002 -> functional.alltypestiny.id
    row-size=12B cardinality=2
 ====
 # intersect uses inner join if distinct on both sides
@@ -290,28 +292,28 @@ select id, year, month from functional.alltypestiny where year=2009 and month=2
 ---- PLAN
 PLAN-ROOT SINK
 |
-05:AGGREGATE [FINALIZE]
-|  group by: id, `year`, `month`
-|  row-size=12B cardinality=2
-|
-04:HASH JOIN [LEFT ANTI JOIN]
+05:HASH JOIN [LEFT ANTI JOIN]
 |  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
 |  row-size=12B cardinality=2
 |
-|--02:SCAN HDFS [functional.alltypestiny]
+|--03:SCAN HDFS [functional.alltypestiny]
 |     partition predicates: `year` = 2009, `month` = 2
 |     HDFS partitions=1/4 files=1 size=115B
 |     row-size=12B cardinality=2
 |
-03:HASH JOIN [LEFT ANTI JOIN]
+04:HASH JOIN [LEFT ANTI JOIN]
 |  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
 |  row-size=12B cardinality=2
 |
-|--01:SCAN HDFS [functional.alltypestiny]
+|--02:SCAN HDFS [functional.alltypestiny]
 |     partition predicates: `year` = 2009, `month` = 1
 |     HDFS partitions=1/4 files=1 size=115B
 |     row-size=12B cardinality=2
 |
+01:AGGREGATE [FINALIZE]
+|  group by: id, `year`, `month`
+|  row-size=12B cardinality=2
+|
 00:SCAN HDFS [functional.alltypestiny]
    partition predicates: `year` = 2009, `month` = 1
    HDFS partitions=1/4 files=1 size=115B
@@ -321,38 +323,38 @@ PLAN-ROOT SINK
 |
 10:EXCHANGE [UNPARTITIONED]
 |
-09:AGGREGATE [FINALIZE]
-|  group by: $a$1.id, $a$1.year, $a$1.month
-|  row-size=12B cardinality=2
-|
-08:EXCHANGE [HASH($a$1.id,$a$1.year,$a$1.month)]
-|
-05:AGGREGATE [STREAMING]
-|  group by: id, `year`, `month`
-|  row-size=12B cardinality=2
-|
-04:HASH JOIN [LEFT ANTI JOIN, BROADCAST]
+05:HASH JOIN [LEFT ANTI JOIN, BROADCAST]
 |  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
 |  row-size=12B cardinality=2
 |
-|--07:EXCHANGE [BROADCAST]
+|--09:EXCHANGE [BROADCAST]
 |  |
-|  02:SCAN HDFS [functional.alltypestiny]
+|  03:SCAN HDFS [functional.alltypestiny]
 |     partition predicates: `year` = 2009, `month` = 2
 |     HDFS partitions=1/4 files=1 size=115B
 |     row-size=12B cardinality=2
 |
-03:HASH JOIN [LEFT ANTI JOIN, BROADCAST]
+04:HASH JOIN [LEFT ANTI JOIN, BROADCAST]
 |  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
 |  row-size=12B cardinality=2
 |
-|--06:EXCHANGE [BROADCAST]
+|--08:EXCHANGE [BROADCAST]
 |  |
-|  01:SCAN HDFS [functional.alltypestiny]
+|  02:SCAN HDFS [functional.alltypestiny]
 |     partition predicates: `year` = 2009, `month` = 1
 |     HDFS partitions=1/4 files=1 size=115B
 |     row-size=12B cardinality=2
 |
+07:AGGREGATE [FINALIZE]
+|  group by: id, `year`, `month`
+|  row-size=12B cardinality=2
+|
+06:EXCHANGE [HASH(id,`year`,`month`)]
+|
+01:AGGREGATE [STREAMING]
+|  group by: id, `year`, `month`
+|  row-size=12B cardinality=2
+|
 00:SCAN HDFS [functional.alltypestiny]
    partition predicates: `year` = 2009, `month` = 1
    HDFS partitions=1/4 files=1 size=115B
@@ -368,32 +370,32 @@ select id, year, month from functional.alltypestiny where year=2009 and month=2)
 ---- PLAN
 PLAN-ROOT SINK
 |
-06:AGGREGATE [FINALIZE]
-|  group by: id, `year`, `month`
-|  row-size=12B cardinality=2
-|
-05:HASH JOIN [LEFT ANTI JOIN]
-|  hash predicates: `month` IS NOT DISTINCT FROM $a$1.month, `year` IS NOT DISTINCT FROM $a$1.year, id IS NOT DISTINCT FROM $a$1.id
+06:HASH JOIN [LEFT ANTI JOIN]
+|  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
 |  row-size=12B cardinality=2
 |
-|--04:AGGREGATE [FINALIZE]
-|  |  group by: id, `year`, `month`
-|  |  row-size=12B cardinality=2
-|  |
-|  03:HASH JOIN [LEFT ANTI JOIN]
+|--05:HASH JOIN [LEFT ANTI JOIN]
 |  |  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
 |  |  row-size=12B cardinality=2
 |  |
-|  |--02:SCAN HDFS [functional.alltypestiny]
+|  |--04:SCAN HDFS [functional.alltypestiny]
 |  |     partition predicates: `year` = 2009, `month` = 2
 |  |     HDFS partitions=1/4 files=1 size=115B
 |  |     row-size=12B cardinality=2
 |  |
-|  01:SCAN HDFS [functional.alltypestiny]
+|  03:AGGREGATE [FINALIZE]
+|  |  group by: id, `year`, `month`
+|  |  row-size=12B cardinality=2
+|  |
+|  02:SCAN HDFS [functional.alltypestiny]
 |     partition predicates: `year` = 2009, `month` = 1
 |     HDFS partitions=1/4 files=1 size=115B
 |     row-size=12B cardinality=2
 |
+01:AGGREGATE [FINALIZE]
+|  group by: id, `year`, `month`
+|  row-size=12B cardinality=2
+|
 00:SCAN HDFS [functional.alltypestiny]
    partition predicates: `year` = 2009, `month` = 1
    HDFS partitions=1/4 files=1 size=115B
@@ -403,48 +405,48 @@ PLAN-ROOT SINK
 |
 13:EXCHANGE [UNPARTITIONED]
 |
-12:AGGREGATE [FINALIZE]
-|  group by: $a$1.id, $a$1.year, $a$1.month
-|  row-size=12B cardinality=2
-|
-11:EXCHANGE [HASH($a$1.id,$a$1.year,$a$1.month)]
-|
-06:AGGREGATE [STREAMING]
-|  group by: id, `year`, `month`
-|  row-size=12B cardinality=2
-|
-05:HASH JOIN [LEFT ANTI JOIN, BROADCAST]
-|  hash predicates: `month` IS NOT DISTINCT FROM $a$1.month, `year` IS NOT DISTINCT FROM $a$1.year, id IS NOT DISTINCT FROM $a$1.id
+06:HASH JOIN [LEFT ANTI JOIN, PARTITIONED]
+|  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
 |  row-size=12B cardinality=2
 |
-|--10:EXCHANGE [BROADCAST]
-|  |
-|  09:AGGREGATE [FINALIZE]
-|  |  group by: $a$1.id, $a$1.year, $a$1.month
-|  |  row-size=12B cardinality=2
-|  |
-|  08:EXCHANGE [HASH($a$1.id,$a$1.year,$a$1.month)]
+|--12:EXCHANGE [HASH(id,`year`,`month`)]
 |  |
-|  04:AGGREGATE [STREAMING]
-|  |  group by: id, `year`, `month`
-|  |  row-size=12B cardinality=2
-|  |
-|  03:HASH JOIN [LEFT ANTI JOIN, BROADCAST]
+|  05:HASH JOIN [LEFT ANTI JOIN, BROADCAST]
 |  |  hash predicates: `month` IS NOT DISTINCT FROM `month`, `year` IS NOT DISTINCT FROM `year`, id IS NOT DISTINCT FROM id
 |  |  row-size=12B cardinality=2
 |  |
-|  |--07:EXCHANGE [BROADCAST]
+|  |--11:EXCHANGE [BROADCAST]
 |  |  |
-|  |  02:SCAN HDFS [functional.alltypestiny]
+|  |  04:SCAN HDFS [functional.alltypestiny]
 |  |     partition predicates: `year` = 2009, `month` = 2
 |  |     HDFS partitions=1/4 files=1 size=115B
 |  |     row-size=12B cardinality=2
 |  |
-|  01:SCAN HDFS [functional.alltypestiny]
+|  10:AGGREGATE [FINALIZE]
+|  |  group by: id, `year`, `month`
+|  |  row-size=12B cardinality=2
+|  |
+|  09:EXCHANGE [HASH(id,`year`,`month`)]
+|  |
+|  03:AGGREGATE [STREAMING]
+|  |  group by: id, `year`, `month`
+|  |  row-size=12B cardinality=2
+|  |
+|  02:SCAN HDFS [functional.alltypestiny]
 |     partition predicates: `year` = 2009, `month` = 1
 |     HDFS partitions=1/4 files=1 size=115B
 |     row-size=12B cardinality=2
 |
+08:AGGREGATE [FINALIZE]
+|  group by: id, `year`, `month`
+|  row-size=12B cardinality=2
+|
+07:EXCHANGE [HASH(id,`year`,`month`)]
+|
+01:AGGREGATE [STREAMING]
+|  group by: id, `year`, `month`
+|  row-size=12B cardinality=2
+|
 00:SCAN HDFS [functional.alltypestiny]
    partition predicates: `year` = 2009, `month` = 1
    HDFS partitions=1/4 files=1 size=115B
@@ -622,56 +624,56 @@ PLAN-ROOT SINK
 |  row-size=89B cardinality=3
 |
 00:UNION
-|  pass-through-operands: all
+|  pass-through-operands: 08,10
 |  row-size=89B cardinality=3
 |
-|--10:TOP-N [LIMIT=1]
-|  |  order by: int_col ASC
+|--07:HASH JOIN [LEFT SEMI JOIN]
+|  |  hash predicates: functional.alltypestiny.bigint_col IS NOT DISTINCT FROM functional.alltypestiny.bigint_col, functional.alltypestiny.bool_col IS NOT DISTINCT FROM functional.alltypestiny.bool_col, functional.alltypestiny.double_col IS NOT DISTINCT FROM functional.alltypestiny.double_col, functional.alltypestiny.float_col IS NOT DISTINCT FROM functional.alltypestiny.float_col, functional.alltypestiny.id IS NOT DISTINCT FROM functional.alltypestiny.id, functional.alltypestiny.int_col [...]
+|  |  runtime filters: RF000 <- functional.alltypestiny.bigint_col, RF001 <- functional.alltypestiny.bool_col, RF002 <- functional.alltypestiny.double_col, RF003 <- functional.alltypestiny.float_col, RF004 <- functional.alltypestiny.id, RF005 <- functional.alltypestiny.int_col, RF006 <- functional.alltypestiny.month, RF007 <- functional.alltypestiny.smallint_col, RF008 <- functional.alltypestiny.timestamp_col, RF010 <- functional.alltypestiny.tinyint_col
 |  |  row-size=89B cardinality=1
 |  |
-|  09:SCAN HDFS [functional.alltypestiny]
-|     partition predicates: `year` = 2009, `month` = 1
-|     HDFS partitions=1/4 files=1 size=115B
-|     row-size=89B cardinality=2
-|
-|--08:SCAN HDFS [functional.alltypestiny]
-|     partition predicates: `year` = 2009, `month` = 1
-|     HDFS partitions=1/4 files=1 size=115B
-|     limit: 1
-|     row-size=89B cardinality=1
-|
-07:AGGREGATE [FINALIZE]
-|  group by: functional.alltypestiny.id, functional.alltypestiny.bool_col, functional.alltypestiny.tinyint_col, functional.alltypestiny.smallint_col, functional.alltypestiny.int_col, functional.alltypestiny.bigint_col, functional.alltypestiny.float_col, functional.alltypestiny.double_col, functional.alltypestiny.date_string_col, functional.alltypestiny.string_col, functional.alltypestiny.timestamp_col, functional.alltypestiny.year, functional.alltypestiny.month
-|  row-size=89B cardinality=1
-|
-06:HASH JOIN [LEFT SEMI JOIN]
-|  hash predicates: functional.alltypestiny.bigint_col IS NOT DISTINCT FROM functional.alltypestiny.bigint_col, functional.alltypestiny.bool_col IS NOT DISTINCT FROM functional.alltypestiny.bool_col, functional.alltypestiny.double_col IS NOT DISTINCT FROM functional.alltypestiny.double_col, functional.alltypestiny.float_col IS NOT DISTINCT FROM functional.alltypestiny.float_col, functional.alltypestiny.id IS NOT DISTINCT FROM functional.alltypestiny.id, functional.alltypestiny.int_col IS [...]
-|  runtime filters: RF000 <- functional.alltypestiny.bigint_col, RF001 <- functional.alltypestiny.bool_col, RF002 <- functional.alltypestiny.double_col, RF003 <- functional.alltypestiny.float_col, RF004 <- functional.alltypestiny.id, RF005 <- functional.alltypestiny.int_col, RF006 <- functional.alltypestiny.month, RF007 <- functional.alltypestiny.smallint_col, RF008 <- functional.alltypestiny.timestamp_col, RF010 <- functional.alltypestiny.tinyint_col
-|  row-size=89B cardinality=1
-|
-|--04:SCAN HDFS [functional.alltypestiny]
+|  |--05:SCAN HDFS [functional.alltypestiny]
+|  |     partition predicates: `year` = 2009, `month` = 2
+|  |     HDFS partitions=1/4 files=1 size=115B
+|  |     limit: 1
+|  |     row-size=89B cardinality=1
+|  |
+|  06:HASH JOIN [LEFT ANTI JOIN]
+|  |  hash predicates: functional.alltypestiny.bigint_col IS NOT DISTINCT FROM bigint_col, functional.alltypestiny.bool_col IS NOT DISTINCT FROM bool_col, functional.alltypestiny.double_col IS NOT DISTINCT FROM double_col, functional.alltypestiny.float_col IS NOT DISTINCT FROM float_col, functional.alltypestiny.id IS NOT DISTINCT FROM id, functional.alltypestiny.int_col IS NOT DISTINCT FROM int_col, functional.alltypestiny.month IS NOT DISTINCT FROM month, functional.alltypestiny.smallin [...]
+|  |  row-size=89B cardinality=1
+|  |
+|  |--04:TOP-N [LIMIT=1]
+|  |  |  order by: int_col ASC
+|  |  |  row-size=89B cardinality=1
+|  |  |
+|  |  03:SCAN HDFS [functional.alltypestiny]
+|  |     partition predicates: `year` = 2009, `month` = 1
+|  |     HDFS partitions=1/4 files=1 size=115B
+|  |     row-size=89B cardinality=2
+|  |
+|  02:AGGREGATE [FINALIZE]
+|  |  group by: functional.alltypestiny.id, functional.alltypestiny.bool_col, functional.alltypestiny.tinyint_col, functional.alltypestiny.smallint_col, functional.alltypestiny.int_col, functional.alltypestiny.bigint_col, functional.alltypestiny.float_col, functional.alltypestiny.double_col, functional.alltypestiny.date_string_col, functional.alltypestiny.string_col, functional.alltypestiny.timestamp_col, functional.alltypestiny.year, functional.alltypestiny.month
+|  |  limit: 1
+|  |  row-size=89B cardinality=1
+|  |
+|  01:SCAN HDFS [functional.alltypestiny]
 |     partition predicates: `year` = 2009, `month` = 2
 |     HDFS partitions=1/4 files=1 size=115B
-|     limit: 1
-|     row-size=89B cardinality=1
-|
-05:HASH JOIN [LEFT ANTI JOIN]
-|  hash predicates: functional.alltypestiny.bigint_col IS NOT DISTINCT FROM bigint_col, functional.alltypestiny.bool_col IS NOT DISTINCT FROM bool_col, functional.alltypestiny.double_col IS NOT DISTINCT FROM double_col, functional.alltypestiny.float_col IS NOT DISTINCT FROM float_col, functional.alltypestiny.id IS NOT DISTINCT FROM id, functional.alltypestiny.int_col IS NOT DISTINCT FROM int_col, functional.alltypestiny.month IS NOT DISTINCT FROM month, functional.alltypestiny.smallint_c [...]
-|  row-size=89B cardinality=1
+|     runtime filters: RF000 -> functional.alltypestiny.bigint_col, RF001 -> functional.alltypestiny.bool_col, RF002 -> functional.alltypestiny.double_col, RF003 -> functional.alltypestiny.float_col, RF004 -> functional.alltypestiny.id, RF005 -> functional.alltypestiny.int_col, RF006 -> functional.alltypestiny.month, RF007 -> functional.alltypestiny.smallint_col, RF008 -> functional.alltypestiny.timestamp_col, RF010 -> functional.alltypestiny.tinyint_col
+|     row-size=89B cardinality=2
 |
-|--03:TOP-N [LIMIT=1]
+|--10:TOP-N [LIMIT=1]
 |  |  order by: int_col ASC
 |  |  row-size=89B cardinality=1
 |  |
-|  02:SCAN HDFS [functional.alltypestiny]
+|  09:SCAN HDFS [functional.alltypestiny]
 |     partition predicates: `year` = 2009, `month` = 1
 |     HDFS partitions=1/4 files=1 size=115B
 |     row-size=89B cardinality=2
 |
-01:SCAN HDFS [functional.alltypestiny]
-   partition predicates: `year` = 2009, `month` = 2
+08:SCAN HDFS [functional.alltypestiny]
+   partition predicates: `year` = 2009, `month` = 1
    HDFS partitions=1/4 files=1 size=115B
-   runtime filters: RF000 -> functional.alltypestiny.bigint_col, RF001 -> functional.alltypestiny.bool_col, RF002 -> functional.alltypestiny.double_col, RF003 -> functional.alltypestiny.float_col, RF004 -> functional.alltypestiny.id, RF005 -> functional.alltypestiny.int_col, RF006 -> functional.alltypestiny.month, RF007 -> functional.alltypestiny.smallint_col, RF008 -> functional.alltypestiny.timestamp_col, RF010 -> functional.alltypestiny.tinyint_col
    limit: 1
    row-size=89B cardinality=1
 ---- DISTRIBUTEDPLAN
@@ -682,66 +684,73 @@ PLAN-ROOT SINK
 |  row-size=89B cardinality=3
 |
 00:UNION
-|  pass-through-operands: all
+|  pass-through-operands: 12,13
 |  row-size=89B cardinality=3
 |
-|--18:MERGING-EXCHANGE [UNPARTITIONED]
-|  |  order by: int_col ASC
-|  |  limit: 1
+|--07:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  hash predicates: functional.alltypestiny.bigint_col IS NOT DISTINCT FROM functional.alltypestiny.bigint_col, functional.alltypestiny.bool_col IS NOT DISTINCT FROM functional.alltypestiny.bool_col, functional.alltypestiny.double_col IS NOT DISTINCT FROM functional.alltypestiny.double_col, functional.alltypestiny.float_col IS NOT DISTINCT FROM functional.alltypestiny.float_col, functional.alltypestiny.id IS NOT DISTINCT FROM functional.alltypestiny.id, functional.alltypestiny.int_col [...]
+|  |  runtime filters: RF000 <- functional.alltypestiny.bigint_col, RF001 <- functional.alltypestiny.bool_col, RF002 <- functional.alltypestiny.double_col, RF003 <- functional.alltypestiny.float_col, RF004 <- functional.alltypestiny.id, RF005 <- functional.alltypestiny.int_col, RF006 <- functional.alltypestiny.month, RF007 <- functional.alltypestiny.smallint_col, RF008 <- functional.alltypestiny.timestamp_col, RF010 <- functional.alltypestiny.tinyint_col
+|  |  row-size=89B cardinality=1
 |  |
-|  10:TOP-N [LIMIT=1]
-|  |  order by: int_col ASC
+|  |--20:EXCHANGE [UNPARTITIONED]
+|  |  |
+|  |  19:EXCHANGE [UNPARTITIONED]
+|  |  |  limit: 1
+|  |  |
+|  |  05:SCAN HDFS [functional.alltypestiny]
+|  |     partition predicates: `year` = 2009, `month` = 2
+|  |     HDFS partitions=1/4 files=1 size=115B
+|  |     limit: 1
+|  |     row-size=89B cardinality=1
+|  |
+|  06:HASH JOIN [LEFT ANTI JOIN, BROADCAST]
+|  |  hash predicates: functional.alltypestiny.bigint_col IS NOT DISTINCT FROM bigint_col, functional.alltypestiny.bool_col IS NOT DISTINCT FROM bool_col, functional.alltypestiny.double_col IS NOT DISTINCT FROM double_col, functional.alltypestiny.float_col IS NOT DISTINCT FROM float_col, functional.alltypestiny.id IS NOT DISTINCT FROM id, functional.alltypestiny.int_col IS NOT DISTINCT FROM int_col, functional.alltypestiny.month IS NOT DISTINCT FROM month, functional.alltypestiny.smallin [...]
 |  |  row-size=89B cardinality=1
 |  |
-|  09:SCAN HDFS [functional.alltypestiny]
-|     partition predicates: `year` = 2009, `month` = 1
-|     HDFS partitions=1/4 files=1 size=115B
-|     row-size=89B cardinality=2
-|
-|--17:EXCHANGE [UNPARTITIONED]
-|  |  limit: 1
+|  |--18:EXCHANGE [UNPARTITIONED]
+|  |  |
+|  |  17:MERGING-EXCHANGE [UNPARTITIONED]
+|  |  |  order by: int_col ASC
+|  |  |  limit: 1
+|  |  |
+|  |  04:TOP-N [LIMIT=1]
+|  |  |  order by: int_col ASC
+|  |  |  row-size=89B cardinality=1
+|  |  |
+|  |  03:SCAN HDFS [functional.alltypestiny]
+|  |     partition predicates: `year` = 2009, `month` = 1
+|  |     HDFS partitions=1/4 files=1 size=115B
+|  |     row-size=89B cardinality=2
 |  |
-|  08:SCAN HDFS [functional.alltypestiny]
-|     partition predicates: `year` = 2009, `month` = 1
-|     HDFS partitions=1/4 files=1 size=115B
-|     limit: 1
-|     row-size=89B cardinality=1
-|
-07:AGGREGATE [FINALIZE]
-|  group by: functional.alltypestiny.id, functional.alltypestiny.bool_col, functional.alltypestiny.tinyint_col, functional.alltypestiny.smallint_col, functional.alltypestiny.int_col, functional.alltypestiny.bigint_col, functional.alltypestiny.float_col, functional.alltypestiny.double_col, functional.alltypestiny.date_string_col, functional.alltypestiny.string_col, functional.alltypestiny.timestamp_col, functional.alltypestiny.year, functional.alltypestiny.month
-|  row-size=89B cardinality=1
-|
-06:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
-|  hash predicates: functional.alltypestiny.bigint_col IS NOT DISTINCT FROM functional.alltypestiny.bigint_col, functional.alltypestiny.bool_col IS NOT DISTINCT FROM functional.alltypestiny.bool_col, functional.alltypestiny.double_col IS NOT DISTINCT FROM functional.alltypestiny.double_col, functional.alltypestiny.float_col IS NOT DISTINCT FROM functional.alltypestiny.float_col, functional.alltypestiny.id IS NOT DISTINCT FROM functional.alltypestiny.id, functional.alltypestiny.int_col IS [...]
-|  runtime filters: RF000 <- functional.alltypestiny.bigint_col, RF001 <- functional.alltypestiny.bool_col, RF002 <- functional.alltypestiny.double_col, RF003 <- functional.alltypestiny.float_col, RF004 <- functional.alltypestiny.id, RF005 <- functional.alltypestiny.int_col, RF006 <- functional.alltypestiny.month, RF007 <- functional.alltypestiny.smallint_col, RF008 <- functional.alltypestiny.timestamp_col, RF010 <- functional.alltypestiny.tinyint_col
-|  row-size=89B cardinality=1
-|
-|--16:EXCHANGE [UNPARTITIONED]
+|  16:EXCHANGE [UNPARTITIONED]
+|  |  limit: 1
 |  |
-|  15:EXCHANGE [UNPARTITIONED]
+|  15:AGGREGATE [FINALIZE]
+|  |  group by: functional.alltypestiny.id, functional.alltypestiny.bool_col, functional.alltypestiny.tinyint_col, functional.alltypestiny.smallint_col, functional.alltypestiny.int_col, functional.alltypestiny.bigint_col, functional.alltypestiny.float_col, functional.alltypestiny.double_col, functional.alltypestiny.date_string_col, functional.alltypestiny.string_col, functional.alltypestiny.timestamp_col, functional.alltypestiny.year, functional.alltypestiny.month
 |  |  limit: 1
+|  |  row-size=89B cardinality=1
 |  |
-|  04:SCAN HDFS [functional.alltypestiny]
+|  14:EXCHANGE [HASH(functional.alltypestiny.id,functional.alltypestiny.bool_col,functional.alltypestiny.tinyint_col,functional.alltypestiny.smallint_col,functional.alltypestiny.int_col,functional.alltypestiny.bigint_col,functional.alltypestiny.float_col,functional.alltypestiny.double_col,functional.alltypestiny.date_string_col,functional.alltypestiny.string_col,functional.alltypestiny.timestamp_col,functional.alltypestiny.year,functional.alltypestiny.month)]
+|  |
+|  02:AGGREGATE [STREAMING]
+|  |  group by: functional.alltypestiny.id, functional.alltypestiny.bool_col, functional.alltypestiny.tinyint_col, functional.alltypestiny.smallint_col, functional.alltypestiny.int_col, functional.alltypestiny.bigint_col, functional.alltypestiny.float_col, functional.alltypestiny.double_col, functional.alltypestiny.date_string_col, functional.alltypestiny.string_col, functional.alltypestiny.timestamp_col, functional.alltypestiny.year, functional.alltypestiny.month
+|  |  row-size=89B cardinality=2
+|  |
+|  01:SCAN HDFS [functional.alltypestiny]
 |     partition predicates: `year` = 2009, `month` = 2
 |     HDFS partitions=1/4 files=1 size=115B
-|     limit: 1
-|     row-size=89B cardinality=1
-|
-05:HASH JOIN [LEFT ANTI JOIN, BROADCAST]
-|  hash predicates: functional.alltypestiny.bigint_col IS NOT DISTINCT FROM bigint_col, functional.alltypestiny.bool_col IS NOT DISTINCT FROM bool_col, functional.alltypestiny.double_col IS NOT DISTINCT FROM double_col, functional.alltypestiny.float_col IS NOT DISTINCT FROM float_col, functional.alltypestiny.id IS NOT DISTINCT FROM id, functional.alltypestiny.int_col IS NOT DISTINCT FROM int_col, functional.alltypestiny.month IS NOT DISTINCT FROM month, functional.alltypestiny.smallint_c [...]
-|  row-size=89B cardinality=1
+|     runtime filters: RF000 -> functional.alltypestiny.bigint_col, RF001 -> functional.alltypestiny.bool_col, RF002 -> functional.alltypestiny.double_col, RF003 -> functional.alltypestiny.float_col, RF004 -> functional.alltypestiny.id, RF005 -> functional.alltypestiny.int_col, RF006 -> functional.alltypestiny.month, RF007 -> functional.alltypestiny.smallint_col, RF008 -> functional.alltypestiny.timestamp_col, RF010 -> functional.alltypestiny.tinyint_col
+|     row-size=89B cardinality=2
 |
-|--14:EXCHANGE [UNPARTITIONED]
-|  |
-|  13:MERGING-EXCHANGE [UNPARTITIONED]
+|--13:MERGING-EXCHANGE [UNPARTITIONED]
 |  |  order by: int_col ASC
 |  |  limit: 1
 |  |
-|  03:TOP-N [LIMIT=1]
+|  10:TOP-N [LIMIT=1]
 |  |  order by: int_col ASC
 |  |  row-size=89B cardinality=1
 |  |
-|  02:SCAN HDFS [functional.alltypestiny]
+|  09:SCAN HDFS [functional.alltypestiny]
 |     partition predicates: `year` = 2009, `month` = 1
 |     HDFS partitions=1/4 files=1 size=115B
 |     row-size=89B cardinality=2
@@ -749,10 +758,252 @@ PLAN-ROOT SINK
 12:EXCHANGE [UNPARTITIONED]
 |  limit: 1
 |
-01:SCAN HDFS [functional.alltypestiny]
-   partition predicates: `year` = 2009, `month` = 2
+08:SCAN HDFS [functional.alltypestiny]
+   partition predicates: `year` = 2009, `month` = 1
    HDFS partitions=1/4 files=1 size=115B
-   runtime filters: RF000 -> functional.alltypestiny.bigint_col, RF001 -> functional.alltypestiny.bool_col, RF002 -> functional.alltypestiny.double_col, RF003 -> functional.alltypestiny.float_col, RF004 -> functional.alltypestiny.id, RF005 -> functional.alltypestiny.int_col, RF006 -> functional.alltypestiny.month, RF007 -> functional.alltypestiny.smallint_col, RF008 -> functional.alltypestiny.timestamp_col, RF010 -> functional.alltypestiny.tinyint_col
    limit: 1
    row-size=89B cardinality=1
 ====
+# DISTINCT is pushed down to left-most operand
+select id from functional.alltypessmall
+intersect
+select id from functional.alltypestiny where int_col > 0;
+---- PLAN
+PLAN-ROOT SINK
+|
+03:HASH JOIN [LEFT SEMI JOIN]
+|  hash predicates: id IS NOT DISTINCT FROM id
+|  runtime filters: RF000 <- id
+|  row-size=4B cardinality=1
+|
+|--02:SCAN HDFS [functional.alltypestiny]
+|     HDFS partitions=4/4 files=4 size=460B
+|     predicates: int_col > 0
+|     row-size=8B cardinality=1
+|
+01:AGGREGATE [FINALIZE]
+|  group by: id
+|  row-size=4B cardinality=99
+|
+00:SCAN HDFS [functional.alltypessmall]
+   HDFS partitions=4/4 files=4 size=6.32KB
+   runtime filters: RF000 -> functional.alltypessmall.id
+   row-size=4B cardinality=100
+---- DISTRIBUTEDPLAN
+PLAN-ROOT SINK
+|
+07:EXCHANGE [UNPARTITIONED]
+|
+03:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
+|  hash predicates: id IS NOT DISTINCT FROM id
+|  runtime filters: RF000 <- id
+|  row-size=4B cardinality=1
+|
+|--06:EXCHANGE [HASH(id)]
+|  |
+|  02:SCAN HDFS [functional.alltypestiny]
+|     HDFS partitions=4/4 files=4 size=460B
+|     predicates: int_col > 0
+|     row-size=8B cardinality=1
+|
+05:AGGREGATE [FINALIZE]
+|  group by: id
+|  row-size=4B cardinality=99
+|
+04:EXCHANGE [HASH(id)]
+|
+01:AGGREGATE [STREAMING]
+|  group by: id
+|  row-size=4B cardinality=99
+|
+00:SCAN HDFS [functional.alltypessmall]
+   HDFS partitions=4/4 files=4 size=6.32KB
+   runtime filters: RF000 -> functional.alltypessmall.id
+   row-size=4B cardinality=100
+====
+# no pushdown of DISTINCT into operands with analytical functions
+select id, count(*) OVER() from functional.alltypessmall
+intersect
+select id, count(*) OVER() from functional.alltypessmall;
+---- PLAN
+PLAN-ROOT SINK
+|
+05:AGGREGATE [FINALIZE]
+|  group by: id, count(*)
+|  row-size=12B cardinality=99
+|
+04:HASH JOIN [LEFT SEMI JOIN]
+|  hash predicates: count(*) IS NOT DISTINCT FROM count(*), id IS NOT DISTINCT FROM id
+|  runtime filters: RF000 <- id
+|  row-size=12B cardinality=100
+|
+|--03:ANALYTIC
+|  |  functions: count(*)
+|  |  row-size=12B cardinality=100
+|  |
+|  02:SCAN HDFS [functional.alltypessmall]
+|     HDFS partitions=4/4 files=4 size=6.32KB
+|     row-size=4B cardinality=100
+|
+01:ANALYTIC
+|  functions: count(*)
+|  row-size=12B cardinality=100
+|
+00:SCAN HDFS [functional.alltypessmall]
+   HDFS partitions=4/4 files=4 size=6.32KB
+   runtime filters: RF000 -> id
+   row-size=4B cardinality=100
+---- DISTRIBUTEDPLAN
+PLAN-ROOT SINK
+|
+05:AGGREGATE [FINALIZE]
+|  group by: id, count(*)
+|  row-size=12B cardinality=99
+|
+04:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  hash predicates: count(*) IS NOT DISTINCT FROM count(*), id IS NOT DISTINCT FROM id
+|  runtime filters: RF000 <- id
+|  row-size=12B cardinality=100
+|
+|--08:EXCHANGE [UNPARTITIONED]
+|  |
+|  03:ANALYTIC
+|  |  functions: count(*)
+|  |  row-size=12B cardinality=100
+|  |
+|  07:EXCHANGE [UNPARTITIONED]
+|  |
+|  02:SCAN HDFS [functional.alltypessmall]
+|     HDFS partitions=4/4 files=4 size=6.32KB
+|     row-size=4B cardinality=100
+|
+01:ANALYTIC
+|  functions: count(*)
+|  row-size=12B cardinality=100
+|
+06:EXCHANGE [UNPARTITIONED]
+|
+00:SCAN HDFS [functional.alltypessmall]
+   HDFS partitions=4/4 files=4 size=6.32KB
+   runtime filters: RF000 -> id
+   row-size=4B cardinality=100
+====
+# no DISTINCT needed as leftmost operand has grouping which implies distinct rows
+select id, sum(int_col) from functional.alltypessmall group by id
+intersect
+select id, 5 from functional.alltypestiny where int_col > 0;
+---- PLAN
+PLAN-ROOT SINK
+|
+03:HASH JOIN [LEFT SEMI JOIN]
+|  hash predicates: sum(int_col) IS NOT DISTINCT FROM 5, id IS NOT DISTINCT FROM id
+|  runtime filters: RF000 <- id
+|  row-size=12B cardinality=1
+|
+|--02:SCAN HDFS [functional.alltypestiny]
+|     HDFS partitions=4/4 files=4 size=460B
+|     predicates: int_col > 0
+|     row-size=8B cardinality=1
+|
+01:AGGREGATE [FINALIZE]
+|  output: sum(int_col)
+|  group by: id
+|  row-size=12B cardinality=99
+|
+00:SCAN HDFS [functional.alltypessmall]
+   HDFS partitions=4/4 files=4 size=6.32KB
+   runtime filters: RF000 -> functional.alltypessmall.id
+   row-size=8B cardinality=100
+---- DISTRIBUTEDPLAN
+PLAN-ROOT SINK
+|
+07:EXCHANGE [UNPARTITIONED]
+|
+03:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  hash predicates: sum(int_col) IS NOT DISTINCT FROM 5, id IS NOT DISTINCT FROM id
+|  runtime filters: RF000 <- id
+|  row-size=12B cardinality=1
+|
+|--06:EXCHANGE [BROADCAST]
+|  |
+|  02:SCAN HDFS [functional.alltypestiny]
+|     HDFS partitions=4/4 files=4 size=460B
+|     predicates: int_col > 0
+|     row-size=8B cardinality=1
+|
+05:AGGREGATE [FINALIZE]
+|  output: sum:merge(int_col)
+|  group by: id
+|  row-size=12B cardinality=99
+|
+04:EXCHANGE [HASH(id)]
+|
+01:AGGREGATE [STREAMING]
+|  output: sum(int_col)
+|  group by: id
+|  row-size=12B cardinality=99
+|
+00:SCAN HDFS [functional.alltypessmall]
+   HDFS partitions=4/4 files=4 size=6.32KB
+   runtime filters: RF000 -> functional.alltypessmall.id
+   row-size=8B cardinality=100
+====
+# no DISTINCT pushdown for valuestmt or single unionstmt without a FROM clause
+select 1 intersect select 1 intersect select 2;
+---- PLAN
+PLAN-ROOT SINK
+|
+05:AGGREGATE [FINALIZE]
+|  group by: $a$1.1
+|  row-size=1B cardinality=1
+|
+04:HASH JOIN [LEFT SEMI JOIN]
+|  hash predicates: `$a$1`.`1` IS NOT DISTINCT FROM `$a$3`.`$c$2`
+|  row-size=1B cardinality=1
+|
+|--02:UNION
+|     constant-operands=1
+|     row-size=1B cardinality=1
+|
+03:HASH JOIN [LEFT SEMI JOIN]
+|  hash predicates: `$a$1`.`1` IS NOT DISTINCT FROM `$a$2`.`$c$1`
+|  row-size=1B cardinality=1
+|
+|--01:UNION
+|     constant-operands=1
+|     row-size=1B cardinality=1
+|
+00:UNION
+   constant-operands=1
+   row-size=1B cardinality=1
+---- DISTRIBUTEDPLAN
+PLAN-ROOT SINK
+|
+05:AGGREGATE [FINALIZE]
+|  group by: $a$1.1
+|  row-size=1B cardinality=1
+|
+04:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  hash predicates: `$a$1`.`1` IS NOT DISTINCT FROM `$a$3`.`$c$2`
+|  row-size=1B cardinality=1
+|
+|--07:EXCHANGE [UNPARTITIONED]
+|  |
+|  02:UNION
+|     constant-operands=1
+|     row-size=1B cardinality=1
+|
+03:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  hash predicates: `$a$1`.`1` IS NOT DISTINCT FROM `$a$2`.`$c$1`
+|  row-size=1B cardinality=1
+|
+|--06:EXCHANGE [UNPARTITIONED]
+|  |
+|  01:UNION
+|     constant-operands=1
+|     row-size=1B cardinality=1
+|
+00:UNION
+   constant-operands=1
+   row-size=1B cardinality=1
+====
diff --git a/testdata/workloads/functional-planner/queries/PlannerTest/tpcds/tpcds-q08.test b/testdata/workloads/functional-planner/queries/PlannerTest/tpcds/tpcds-q08.test
index 96ecc7e..862baca 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/tpcds/tpcds-q08.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/tpcds/tpcds-q08.test
@@ -78,10 +78,10 @@ GROUP BY s_store_name
 ORDER BY s_store_name
 LIMIT 100;
 ---- PLAN
-Max Per-Host Resource Reservation: Memory=14.90MB Threads=7
-Per-Host Resource Estimates: Memory=219MB
+Max Per-Host Resource Reservation: Memory=15.84MB Threads=7
+Per-Host Resource Estimates: Memory=228MB
 F00:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
-|  Per-Host Resources: mem-estimate=218.81MB mem-reservation=14.90MB thread-reservation=7 runtime-filters-memory=5.00MB
+|  Per-Host Resources: mem-estimate=227.81MB mem-reservation=15.84MB thread-reservation=7 runtime-filters-memory=4.00MB
 PLAN-ROOT SINK
 |  output exprs: s_store_name, sum(ss_net_profit)
 |  mem-estimate=0B mem-reservation=0B thread-reservation=0
@@ -100,43 +100,36 @@ PLAN-ROOT SINK
 |  in pipelines: 13(GETNEXT), 00(OPEN)
 |
 12:HASH JOIN [INNER JOIN]
-|  hash predicates: substring(s_zip, 1, 2) = substring($a$1.ca_zip, 1, 2)
+|  hash predicates: substring(s_zip, 1, 2) = substring(substring(ca_zip, 1, 5), 1, 2)
 |  fk/pk conjuncts: assumed fk/pk
-|  runtime filters: RF000[bloom] <- substring($a$1.ca_zip, 1, 2)
+|  runtime filters: RF000[bloom] <- substring(substring(ca_zip, 1, 5), 1, 2)
 |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  tuple-ids=0,1,2,10 row-size=73B cardinality=293.73K
-|  in pipelines: 00(GETNEXT), 09(OPEN)
+|  tuple-ids=0,1,2,4 row-size=73B cardinality=293.73K
+|  in pipelines: 00(GETNEXT), 04(OPEN)
 |
-|--09:AGGREGATE [FINALIZE]
-|  |  group by: substring(ca_zip, CAST(1 AS BIGINT), CAST(5 AS BIGINT))
-|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=10 row-size=12B cardinality=3.96K
-|  |  in pipelines: 09(GETNEXT), 03(OPEN)
-|  |
-|  08:HASH JOIN [LEFT SEMI JOIN]
+|--09:HASH JOIN [LEFT SEMI JOIN]
 |  |  hash predicates: substring(ca_zip, 1, 5) IS NOT DISTINCT FROM substring(ca_zip, 1, 5)
-|  |  runtime filters: RF006[bloom] <- substring(ca_zip, 1, 5)
 |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=3 row-size=17B cardinality=5.00K
-|  |  in pipelines: 03(GETNEXT), 07(OPEN)
+|  |  tuple-ids=4 row-size=12B cardinality=396
+|  |  in pipelines: 04(GETNEXT), 08(OPEN)
 |  |
-|  |--07:AGGREGATE [FINALIZE]
+|  |--08:AGGREGATE [FINALIZE]
 |  |  |  output: count(*)
 |  |  |  group by: substring(ca_zip, CAST(1 AS BIGINT), CAST(5 AS BIGINT))
 |  |  |  having: count(*) > CAST(10 AS BIGINT)
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=7 row-size=20B cardinality=396
-|  |  |  in pipelines: 07(GETNEXT), 04(OPEN)
+|  |  |  tuple-ids=8 row-size=20B cardinality=396
+|  |  |  in pipelines: 08(GETNEXT), 05(OPEN)
 |  |  |
-|  |  06:HASH JOIN [INNER JOIN]
+|  |  07:HASH JOIN [INNER JOIN]
 |  |  |  hash predicates: ca_address_sk = c_current_addr_sk
 |  |  |  fk/pk conjuncts: none
-|  |  |  runtime filters: RF008[bloom] <- c_current_addr_sk
+|  |  |  runtime filters: RF006[bloom] <- c_current_addr_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=5,6 row-size=38B cardinality=51.30K
-|  |  |  in pipelines: 04(GETNEXT), 05(OPEN)
+|  |  |  tuple-ids=6,7 row-size=38B cardinality=51.30K
+|  |  |  in pipelines: 05(GETNEXT), 06(OPEN)
 |  |  |
-|  |  |--05:SCAN HDFS [tpcds_parquet.customer]
+|  |  |--06:SCAN HDFS [tpcds_parquet.customer]
 |  |  |     HDFS partitions=1/1 files=1 size=5.49MB
 |  |  |     predicates: c_preferred_cust_flag = 'Y'
 |  |  |     stored statistics:
@@ -146,24 +139,29 @@ PLAN-ROOT SINK
 |  |  |     parquet statistics predicates: c_preferred_cust_flag = 'Y'
 |  |  |     parquet dictionary predicates: c_preferred_cust_flag = 'Y'
 |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |     tuple-ids=6 row-size=17B cardinality=50.00K
-|  |  |     in pipelines: 05(GETNEXT)
+|  |  |     tuple-ids=7 row-size=17B cardinality=50.00K
+|  |  |     in pipelines: 06(GETNEXT)
 |  |  |
-|  |  04:SCAN HDFS [tpcds_parquet.customer_address]
+|  |  05:SCAN HDFS [tpcds_parquet.customer_address]
 |  |     HDFS partitions=1/1 files=1 size=1.16MB
-|  |     runtime filters: RF008[bloom] -> ca_address_sk
+|  |     runtime filters: RF006[bloom] -> ca_address_sk
 |  |     stored statistics:
 |  |       table: rows=50.00K size=1.16MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=50.00K
 |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |     tuple-ids=5 row-size=21B cardinality=50.00K
-|  |     in pipelines: 04(GETNEXT)
+|  |     tuple-ids=6 row-size=21B cardinality=50.00K
+|  |     in pipelines: 05(GETNEXT)
+|  |
+|  04:AGGREGATE [FINALIZE]
+|  |  group by: substring(ca_zip, CAST(1 AS BIGINT), CAST(5 AS BIGINT))
+|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=4 row-size=12B cardinality=3.96K
+|  |  in pipelines: 04(GETNEXT), 03(OPEN)
 |  |
 |  03:SCAN HDFS [tpcds_parquet.customer_address]
 |     HDFS partitions=1/1 files=1 size=1.16MB
 |     predicates: substring(ca_zip, CAST(1 AS BIGINT), CAST(5 AS BIGINT)) IN ('24128', '76232', '65084', '87816', '83926', '77556', '20548', '26231', '43848', '15126', '91137', '61265', '98294', '25782', '17920', '18426', '98235', '40081', '84093', '28577', '55565', '17183', '54601', '67897', '22752', '86284', '18376', '38607', '45200', '21756', '29741', '96765', '23932', '89360', '29839', '25989', '28898', '91068', '72550', '10390', '18845', '47770', '82636', '41367', '76638', '86198',  [...]
-|     runtime filters: RF006[bloom] -> substring(ca_zip, 1, 5)
 |     stored statistics:
 |       table: rows=50.00K size=1.16MB
 |       columns: all
@@ -225,15 +223,15 @@ PLAN-ROOT SINK
    tuple-ids=0 row-size=12B cardinality=2.88M
    in pipelines: 00(GETNEXT)
 ---- DISTRIBUTEDPLAN
-Max Per-Host Resource Reservation: Memory=30.15MB Threads=16
-Per-Host Resource Estimates: Memory=285MB
+Max Per-Host Resource Reservation: Memory=29.15MB Threads=15
+Per-Host Resource Estimates: Memory=284MB
 F09:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=16.00KB mem-reservation=0B thread-reservation=1
 PLAN-ROOT SINK
 |  output exprs: s_store_name, sum(ss_net_profit)
 |  mem-estimate=0B mem-reservation=0B thread-reservation=0
 |
-26:MERGING-EXCHANGE [UNPARTITIONED]
+25:MERGING-EXCHANGE [UNPARTITIONED]
 |  order by: s_store_name ASC
 |  limit: 100
 |  mem-estimate=16.00KB mem-reservation=0B thread-reservation=0
@@ -246,22 +244,22 @@ Per-Host Resources: mem-estimate=10.02MB mem-reservation=1.94MB thread-reservati
 |  order by: s_store_name ASC
 |  mem-estimate=258B mem-reservation=0B thread-reservation=0
 |  tuple-ids=14 row-size=32B cardinality=8
-|  in pipelines: 14(GETNEXT), 25(OPEN)
+|  in pipelines: 14(GETNEXT), 24(OPEN)
 |
-25:AGGREGATE [FINALIZE]
+24:AGGREGATE [FINALIZE]
 |  output: sum:merge(ss_net_profit)
 |  group by: s_store_name
 |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  tuple-ids=13 row-size=32B cardinality=8
-|  in pipelines: 25(GETNEXT), 00(OPEN)
+|  in pipelines: 24(GETNEXT), 00(OPEN)
 |
-24:EXCHANGE [HASH(s_store_name)]
+23:EXCHANGE [HASH(s_store_name)]
 |  mem-estimate=16.00KB mem-reservation=0B thread-reservation=0
 |  tuple-ids=13 row-size=32B cardinality=8
 |  in pipelines: 00(GETNEXT)
 |
 F00:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-Per-Host Resources: mem-estimate=50.90MB mem-reservation=11.81MB thread-reservation=2 runtime-filters-memory=3.00MB
+Per-Host Resources: mem-estimate=50.86MB mem-reservation=11.81MB thread-reservation=2 runtime-filters-memory=3.00MB
 13:AGGREGATE [STREAMING]
 |  output: sum(ss_net_profit)
 |  group by: s_store_name
@@ -270,91 +268,64 @@ Per-Host Resources: mem-estimate=50.90MB mem-reservation=11.81MB thread-reservat
 |  in pipelines: 00(GETNEXT)
 |
 12:HASH JOIN [INNER JOIN, BROADCAST]
-|  hash predicates: substring(s_zip, 1, 2) = substring($a$1.ca_zip, 1, 2)
+|  hash predicates: substring(s_zip, 1, 2) = substring(substring(ca_zip, 1, 5), 1, 2)
 |  fk/pk conjuncts: assumed fk/pk
-|  runtime filters: RF000[bloom] <- substring($a$1.ca_zip, 1, 2)
+|  runtime filters: RF000[bloom] <- substring(substring(ca_zip, 1, 5), 1, 2)
 |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  tuple-ids=0,1,2,10 row-size=73B cardinality=293.73K
-|  in pipelines: 00(GETNEXT), 22(OPEN)
+|  tuple-ids=0,1,2,4 row-size=73B cardinality=293.73K
+|  in pipelines: 00(GETNEXT), 18(OPEN)
 |
-|--23:EXCHANGE [BROADCAST]
-|  |  mem-estimate=62.42KB mem-reservation=0B thread-reservation=0
-|  |  tuple-ids=10 row-size=12B cardinality=3.96K
-|  |  in pipelines: 22(GETNEXT)
-|  |
-|  F07:PLAN FRAGMENT [HASH($a$1.ca_zip)] hosts=1 instances=1
-|  Per-Host Resources: mem-estimate=10.06MB mem-reservation=1.94MB thread-reservation=1
-|  22:AGGREGATE [FINALIZE]
-|  |  group by: $a$1.ca_zip
-|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=10 row-size=12B cardinality=3.96K
-|  |  in pipelines: 22(GETNEXT), 03(OPEN)
-|  |
-|  21:EXCHANGE [HASH($a$1.ca_zip)]
-|  |  mem-estimate=62.42KB mem-reservation=0B thread-reservation=0
-|  |  tuple-ids=10 row-size=12B cardinality=3.96K
-|  |  in pipelines: 03(GETNEXT)
-|  |
-|  F03:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
-|  Per-Host Resources: mem-estimate=28.95MB mem-reservation=5.06MB thread-reservation=2 runtime-filters-memory=1.00MB
-|  09:AGGREGATE [STREAMING]
-|  |  group by: substring(ca_zip, CAST(1 AS BIGINT), CAST(5 AS BIGINT))
-|  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=10 row-size=12B cardinality=3.96K
-|  |  in pipelines: 03(GETNEXT)
+|--22:EXCHANGE [BROADCAST]
+|  |  mem-estimate=16.00KB mem-reservation=0B thread-reservation=0
+|  |  tuple-ids=4 row-size=12B cardinality=396
+|  |  in pipelines: 18(GETNEXT)
 |  |
-|  08:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  F04:PLAN FRAGMENT [HASH(substring(ca_zip, 1, 5))] hosts=1 instances=1
+|  Per-Host Resources: mem-estimate=22.00MB mem-reservation=5.81MB thread-reservation=1
+|  09:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  hash predicates: substring(ca_zip, 1, 5) IS NOT DISTINCT FROM substring(ca_zip, 1, 5)
-|  |  runtime filters: RF006[bloom] <- substring(ca_zip, 1, 5)
 |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=3 row-size=17B cardinality=5.00K
-|  |  in pipelines: 03(GETNEXT), 19(OPEN)
+|  |  tuple-ids=4 row-size=12B cardinality=396
+|  |  in pipelines: 18(GETNEXT), 21(OPEN)
 |  |
-|  |--20:EXCHANGE [BROADCAST]
-|  |  |  mem-estimate=17.02KB mem-reservation=0B thread-reservation=0
-|  |  |  tuple-ids=7 row-size=20B cardinality=396
-|  |  |  in pipelines: 19(GETNEXT)
-|  |  |
-|  |  F06:PLAN FRAGMENT [HASH(substring(ca_zip, 1, 5))] hosts=1 instances=1
-|  |  Per-Host Resources: mem-estimate=10.10MB mem-reservation=1.94MB thread-reservation=1
-|  |  19:AGGREGATE [FINALIZE]
+|  |--21:AGGREGATE [FINALIZE]
 |  |  |  output: count:merge(*)
 |  |  |  group by: substring(ca_zip, 1, 5)
 |  |  |  having: count(*) > CAST(10 AS BIGINT)
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=7 row-size=20B cardinality=396
-|  |  |  in pipelines: 19(GETNEXT), 04(OPEN)
+|  |  |  tuple-ids=8 row-size=20B cardinality=396
+|  |  |  in pipelines: 21(GETNEXT), 05(OPEN)
 |  |  |
-|  |  18:EXCHANGE [HASH(substring(ca_zip, 1, 5))]
+|  |  20:EXCHANGE [HASH(substring(ca_zip, 1, 5))]
 |  |  |  mem-estimate=101.36KB mem-reservation=0B thread-reservation=0
-|  |  |  tuple-ids=7 row-size=20B cardinality=3.96K
-|  |  |  in pipelines: 04(GETNEXT)
+|  |  |  tuple-ids=8 row-size=20B cardinality=3.96K
+|  |  |  in pipelines: 05(GETNEXT)
 |  |  |
-|  |  F04:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  F05:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  Per-Host Resources: mem-estimate=45.77MB mem-reservation=5.44MB thread-reservation=2 runtime-filters-memory=1.00MB
-|  |  07:AGGREGATE [STREAMING]
+|  |  08:AGGREGATE [STREAMING]
 |  |  |  output: count(*)
 |  |  |  group by: substring(ca_zip, CAST(1 AS BIGINT), CAST(5 AS BIGINT))
 |  |  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=7 row-size=20B cardinality=3.96K
-|  |  |  in pipelines: 04(GETNEXT)
+|  |  |  tuple-ids=8 row-size=20B cardinality=3.96K
+|  |  |  in pipelines: 05(GETNEXT)
 |  |  |
-|  |  06:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  07:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash predicates: ca_address_sk = c_current_addr_sk
 |  |  |  fk/pk conjuncts: none
-|  |  |  runtime filters: RF008[bloom] <- c_current_addr_sk
+|  |  |  runtime filters: RF006[bloom] <- c_current_addr_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=5,6 row-size=38B cardinality=51.30K
-|  |  |  in pipelines: 04(GETNEXT), 05(OPEN)
+|  |  |  tuple-ids=6,7 row-size=38B cardinality=51.30K
+|  |  |  in pipelines: 05(GETNEXT), 06(OPEN)
 |  |  |
-|  |  |--17:EXCHANGE [BROADCAST]
+|  |  |--19:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=851.08KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=6 row-size=17B cardinality=50.00K
-|  |  |  |  in pipelines: 05(GETNEXT)
+|  |  |  |  tuple-ids=7 row-size=17B cardinality=50.00K
+|  |  |  |  in pipelines: 06(GETNEXT)
 |  |  |  |
-|  |  |  F05:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F06:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Host Resources: mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=2
-|  |  |  05:SCAN HDFS [tpcds_parquet.customer, RANDOM]
+|  |  |  06:SCAN HDFS [tpcds_parquet.customer, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=5.49MB
 |  |  |     predicates: c_preferred_cust_flag = 'Y'
 |  |  |     stored statistics:
@@ -364,24 +335,42 @@ Per-Host Resources: mem-estimate=50.90MB mem-reservation=11.81MB thread-reservat
 |  |  |     parquet statistics predicates: c_preferred_cust_flag = 'Y'
 |  |  |     parquet dictionary predicates: c_preferred_cust_flag = 'Y'
 |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |     tuple-ids=6 row-size=17B cardinality=50.00K
-|  |  |     in pipelines: 05(GETNEXT)
+|  |  |     tuple-ids=7 row-size=17B cardinality=50.00K
+|  |  |     in pipelines: 06(GETNEXT)
 |  |  |
-|  |  04:SCAN HDFS [tpcds_parquet.customer_address, RANDOM]
+|  |  05:SCAN HDFS [tpcds_parquet.customer_address, RANDOM]
 |  |     HDFS partitions=1/1 files=1 size=1.16MB
-|  |     runtime filters: RF008[bloom] -> ca_address_sk
+|  |     runtime filters: RF006[bloom] -> ca_address_sk
 |  |     stored statistics:
 |  |       table: rows=50.00K size=1.16MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=50.00K
 |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |     tuple-ids=5 row-size=21B cardinality=50.00K
-|  |     in pipelines: 04(GETNEXT)
+|  |     tuple-ids=6 row-size=21B cardinality=50.00K
+|  |     in pipelines: 05(GETNEXT)
+|  |
+|  18:AGGREGATE [FINALIZE]
+|  |  group by: substring(ca_zip, 1, 5)
+|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=4 row-size=12B cardinality=3.96K
+|  |  in pipelines: 18(GETNEXT), 03(OPEN)
+|  |
+|  17:EXCHANGE [HASH(substring(ca_zip, 1, 5))]
+|  |  mem-estimate=62.42KB mem-reservation=0B thread-reservation=0
+|  |  tuple-ids=4 row-size=12B cardinality=3.96K
+|  |  in pipelines: 03(GETNEXT)
+|  |
+|  F03:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  Per-Host Resources: mem-estimate=26.00MB mem-reservation=2.12MB thread-reservation=2
+|  04:AGGREGATE [STREAMING]
+|  |  group by: substring(ca_zip, CAST(1 AS BIGINT), CAST(5 AS BIGINT))
+|  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=4 row-size=12B cardinality=3.96K
+|  |  in pipelines: 03(GETNEXT)
 |  |
 |  03:SCAN HDFS [tpcds_parquet.customer_address, RANDOM]
 |     HDFS partitions=1/1 files=1 size=1.16MB
 |     predicates: substring(ca_zip, CAST(1 AS BIGINT), CAST(5 AS BIGINT)) IN ('24128', '76232', '65084', '87816', '83926', '77556', '20548', '26231', '43848', '15126', '91137', '61265', '98294', '25782', '17920', '18426', '98235', '40081', '84093', '28577', '55565', '17183', '54601', '67897', '22752', '86284', '18376', '38607', '45200', '21756', '29741', '96765', '23932', '89360', '29839', '25989', '28898', '91068', '72550', '10390', '18845', '47770', '82636', '41367', '76638', '86198',  [...]
-|     runtime filters: RF006[bloom] -> substring(ca_zip, 1, 5)
 |     stored statistics:
 |       table: rows=50.00K size=1.16MB
 |       columns: all
@@ -457,15 +446,15 @@ Per-Host Resources: mem-estimate=50.90MB mem-reservation=11.81MB thread-reservat
    tuple-ids=0 row-size=12B cardinality=2.88M
    in pipelines: 00(GETNEXT)
 ---- PARALLELPLANS
-Max Per-Host Resource Reservation: Memory=48.77MB Threads=17
-Per-Host Resource Estimates: Memory=223MB
+Max Per-Host Resource Reservation: Memory=44.84MB Threads=16
+Per-Host Resource Estimates: Memory=218MB
 F09:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Instance Resources: mem-estimate=16.00KB mem-reservation=0B thread-reservation=1
 PLAN-ROOT SINK
 |  output exprs: s_store_name, sum(ss_net_profit)
 |  mem-estimate=0B mem-reservation=0B thread-reservation=0
 |
-26:MERGING-EXCHANGE [UNPARTITIONED]
+25:MERGING-EXCHANGE [UNPARTITIONED]
 |  order by: s_store_name ASC
 |  limit: 100
 |  mem-estimate=16.00KB mem-reservation=0B thread-reservation=0
@@ -478,16 +467,16 @@ Per-Instance Resources: mem-estimate=10.02MB mem-reservation=1.94MB thread-reser
 |  order by: s_store_name ASC
 |  mem-estimate=258B mem-reservation=0B thread-reservation=0
 |  tuple-ids=14 row-size=32B cardinality=8
-|  in pipelines: 14(GETNEXT), 25(OPEN)
+|  in pipelines: 14(GETNEXT), 24(OPEN)
 |
-25:AGGREGATE [FINALIZE]
+24:AGGREGATE [FINALIZE]
 |  output: sum:merge(ss_net_profit)
 |  group by: s_store_name
 |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  tuple-ids=13 row-size=32B cardinality=8
-|  in pipelines: 25(GETNEXT), 00(OPEN)
+|  in pipelines: 24(GETNEXT), 00(OPEN)
 |
-24:EXCHANGE [HASH(s_store_name)]
+23:EXCHANGE [HASH(s_store_name)]
 |  mem-estimate=16.00KB mem-reservation=0B thread-reservation=0
 |  tuple-ids=13 row-size=32B cardinality=8
 |  in pipelines: 00(GETNEXT)
@@ -504,116 +493,88 @@ Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.00MB thread-reser
 |
 12:HASH JOIN [INNER JOIN, BROADCAST]
 |  hash-table-id=00
-|  hash predicates: substring(s_zip, 1, 2) = substring($a$1.ca_zip, 1, 2)
+|  hash predicates: substring(s_zip, 1, 2) = substring(substring(ca_zip, 1, 5), 1, 2)
 |  fk/pk conjuncts: assumed fk/pk
 |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  tuple-ids=0,1,2,10 row-size=73B cardinality=293.73K
-|  in pipelines: 00(GETNEXT), 22(OPEN)
+|  tuple-ids=0,1,2,4 row-size=73B cardinality=293.73K
+|  in pipelines: 00(GETNEXT), 18(OPEN)
 |
 |--F10:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  Per-Instance Resources: mem-estimate=4.94MB mem-reservation=4.88MB thread-reservation=1 runtime-filters-memory=1.00MB
+|  |  Per-Instance Resources: mem-estimate=4.89MB mem-reservation=4.88MB thread-reservation=1 runtime-filters-memory=1.00MB
 |  JOIN BUILD
 |  |  join-table-id=00 plan-id=01 cohort-id=01
-|  |  build expressions: substring($a$1.ca_zip, 1, 2)
-|  |  runtime filters: RF000[bloom] <- substring($a$1.ca_zip, 1, 2)
+|  |  build expressions: substring(substring(ca_zip, 1, 5), 1, 2)
+|  |  runtime filters: RF000[bloom] <- substring(substring(ca_zip, 1, 5), 1, 2)
 |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |
-|  23:EXCHANGE [BROADCAST]
-|  |  mem-estimate=62.42KB mem-reservation=0B thread-reservation=0
-|  |  tuple-ids=10 row-size=12B cardinality=3.96K
-|  |  in pipelines: 22(GETNEXT)
+|  22:EXCHANGE [BROADCAST]
+|  |  mem-estimate=16.00KB mem-reservation=0B thread-reservation=0
+|  |  tuple-ids=4 row-size=12B cardinality=396
+|  |  in pipelines: 18(GETNEXT)
 |  |
-|  F07:PLAN FRAGMENT [HASH($a$1.ca_zip)] hosts=1 instances=1
+|  F04:PLAN FRAGMENT [HASH(substring(ca_zip, 1, 5))] hosts=1 instances=1
 |  Per-Instance Resources: mem-estimate=10.06MB mem-reservation=1.94MB thread-reservation=1
-|  22:AGGREGATE [FINALIZE]
-|  |  group by: $a$1.ca_zip
-|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=10 row-size=12B cardinality=3.96K
-|  |  in pipelines: 22(GETNEXT), 03(OPEN)
-|  |
-|  21:EXCHANGE [HASH($a$1.ca_zip)]
-|  |  mem-estimate=62.42KB mem-reservation=0B thread-reservation=0
-|  |  tuple-ids=10 row-size=12B cardinality=3.96K
-|  |  in pipelines: 03(GETNEXT)
-|  |
-|  F03:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
-|  Per-Host Shared Resources: mem-estimate=1.00MB mem-reservation=1.00MB thread-reservation=0 runtime-filters-memory=1.00MB
-|  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=2.12MB thread-reservation=1
-|  09:AGGREGATE [STREAMING]
-|  |  group by: substring(ca_zip, CAST(1 AS BIGINT), CAST(5 AS BIGINT))
-|  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=10 row-size=12B cardinality=3.96K
-|  |  in pipelines: 03(GETNEXT)
-|  |
-|  08:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  09:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  hash-table-id=01
 |  |  hash predicates: substring(ca_zip, 1, 5) IS NOT DISTINCT FROM substring(ca_zip, 1, 5)
 |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=3 row-size=17B cardinality=5.00K
-|  |  in pipelines: 03(GETNEXT), 19(OPEN)
+|  |  tuple-ids=4 row-size=12B cardinality=396
+|  |  in pipelines: 18(GETNEXT), 21(OPEN)
 |  |
-|  |--F11:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
-|  |  |  Per-Instance Resources: mem-estimate=4.89MB mem-reservation=4.88MB thread-reservation=1 runtime-filters-memory=1.00MB
+|  |--F11:PLAN FRAGMENT [HASH(substring(ca_zip, 1, 5))] hosts=1 instances=1
+|  |  |  Per-Instance Resources: mem-estimate=11.94MB mem-reservation=3.88MB thread-reservation=1
 |  |  JOIN BUILD
 |  |  |  join-table-id=01 plan-id=02 cohort-id=02
 |  |  |  build expressions: substring(ca_zip, 1, 5)
-|  |  |  runtime filters: RF006[bloom] <- substring(ca_zip, 1, 5)
-|  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
-|  |  |
-|  |  20:EXCHANGE [BROADCAST]
-|  |  |  mem-estimate=17.02KB mem-reservation=0B thread-reservation=0
-|  |  |  tuple-ids=7 row-size=20B cardinality=396
-|  |  |  in pipelines: 19(GETNEXT)
+|  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |
-|  |  F06:PLAN FRAGMENT [HASH(substring(ca_zip, 1, 5))] hosts=1 instances=1
-|  |  Per-Instance Resources: mem-estimate=10.10MB mem-reservation=1.94MB thread-reservation=1
-|  |  19:AGGREGATE [FINALIZE]
+|  |  21:AGGREGATE [FINALIZE]
 |  |  |  output: count:merge(*)
 |  |  |  group by: substring(ca_zip, 1, 5)
 |  |  |  having: count(*) > CAST(10 AS BIGINT)
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=7 row-size=20B cardinality=396
-|  |  |  in pipelines: 19(GETNEXT), 04(OPEN)
+|  |  |  tuple-ids=8 row-size=20B cardinality=396
+|  |  |  in pipelines: 21(GETNEXT), 05(OPEN)
 |  |  |
-|  |  18:EXCHANGE [HASH(substring(ca_zip, 1, 5))]
+|  |  20:EXCHANGE [HASH(substring(ca_zip, 1, 5))]
 |  |  |  mem-estimate=101.36KB mem-reservation=0B thread-reservation=0
-|  |  |  tuple-ids=7 row-size=20B cardinality=3.96K
-|  |  |  in pipelines: 04(GETNEXT)
+|  |  |  tuple-ids=8 row-size=20B cardinality=3.96K
+|  |  |  in pipelines: 05(GETNEXT)
 |  |  |
-|  |  F04:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  F05:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  Per-Host Shared Resources: mem-estimate=1.00MB mem-reservation=1.00MB thread-reservation=0 runtime-filters-memory=1.00MB
 |  |  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=2.50MB thread-reservation=1
-|  |  07:AGGREGATE [STREAMING]
+|  |  08:AGGREGATE [STREAMING]
 |  |  |  output: count(*)
 |  |  |  group by: substring(ca_zip, CAST(1 AS BIGINT), CAST(5 AS BIGINT))
 |  |  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=7 row-size=20B cardinality=3.96K
-|  |  |  in pipelines: 04(GETNEXT)
+|  |  |  tuple-ids=8 row-size=20B cardinality=3.96K
+|  |  |  in pipelines: 05(GETNEXT)
 |  |  |
-|  |  06:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  07:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash-table-id=02
 |  |  |  hash predicates: ca_address_sk = c_current_addr_sk
 |  |  |  fk/pk conjuncts: none
 |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=5,6 row-size=38B cardinality=51.30K
-|  |  |  in pipelines: 04(GETNEXT), 05(OPEN)
+|  |  |  tuple-ids=6,7 row-size=38B cardinality=51.30K
+|  |  |  in pipelines: 05(GETNEXT), 06(OPEN)
 |  |  |
 |  |  |--F12:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=5.71MB mem-reservation=4.88MB thread-reservation=1 runtime-filters-memory=1.00MB
 |  |  |  JOIN BUILD
 |  |  |  |  join-table-id=02 plan-id=03 cohort-id=03
 |  |  |  |  build expressions: c_current_addr_sk
-|  |  |  |  runtime filters: RF008[bloom] <- c_current_addr_sk
+|  |  |  |  runtime filters: RF006[bloom] <- c_current_addr_sk
 |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  17:EXCHANGE [BROADCAST]
+|  |  |  19:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=851.08KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=6 row-size=17B cardinality=50.00K
-|  |  |  |  in pipelines: 05(GETNEXT)
+|  |  |  |  tuple-ids=7 row-size=17B cardinality=50.00K
+|  |  |  |  in pipelines: 06(GETNEXT)
 |  |  |  |
-|  |  |  F05:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F06:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  05:SCAN HDFS [tpcds_parquet.customer, RANDOM]
+|  |  |  06:SCAN HDFS [tpcds_parquet.customer, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=5.49MB
 |  |  |     predicates: c_preferred_cust_flag = 'Y'
 |  |  |     stored statistics:
@@ -623,24 +584,42 @@ Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.00MB thread-reser
 |  |  |     parquet statistics predicates: c_preferred_cust_flag = 'Y'
 |  |  |     parquet dictionary predicates: c_preferred_cust_flag = 'Y'
 |  |  |     mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=0
-|  |  |     tuple-ids=6 row-size=17B cardinality=50.00K
-|  |  |     in pipelines: 05(GETNEXT)
+|  |  |     tuple-ids=7 row-size=17B cardinality=50.00K
+|  |  |     in pipelines: 06(GETNEXT)
 |  |  |
-|  |  04:SCAN HDFS [tpcds_parquet.customer_address, RANDOM]
+|  |  05:SCAN HDFS [tpcds_parquet.customer_address, RANDOM]
 |  |     HDFS partitions=1/1 files=1 size=1.16MB
-|  |     runtime filters: RF008[bloom] -> ca_address_sk
+|  |     runtime filters: RF006[bloom] -> ca_address_sk
 |  |     stored statistics:
 |  |       table: rows=50.00K size=1.16MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=50.00K
 |  |     mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=0
-|  |     tuple-ids=5 row-size=21B cardinality=50.00K
-|  |     in pipelines: 04(GETNEXT)
+|  |     tuple-ids=6 row-size=21B cardinality=50.00K
+|  |     in pipelines: 05(GETNEXT)
+|  |
+|  18:AGGREGATE [FINALIZE]
+|  |  group by: substring(ca_zip, 1, 5)
+|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=4 row-size=12B cardinality=3.96K
+|  |  in pipelines: 18(GETNEXT), 03(OPEN)
+|  |
+|  17:EXCHANGE [HASH(substring(ca_zip, 1, 5))]
+|  |  mem-estimate=62.42KB mem-reservation=0B thread-reservation=0
+|  |  tuple-ids=4 row-size=12B cardinality=3.96K
+|  |  in pipelines: 03(GETNEXT)
+|  |
+|  F03:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=2.12MB thread-reservation=1
+|  04:AGGREGATE [STREAMING]
+|  |  group by: substring(ca_zip, CAST(1 AS BIGINT), CAST(5 AS BIGINT))
+|  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=4 row-size=12B cardinality=3.96K
+|  |  in pipelines: 03(GETNEXT)
 |  |
 |  03:SCAN HDFS [tpcds_parquet.customer_address, RANDOM]
 |     HDFS partitions=1/1 files=1 size=1.16MB
 |     predicates: substring(ca_zip, CAST(1 AS BIGINT), CAST(5 AS BIGINT)) IN ('24128', '76232', '65084', '87816', '83926', '77556', '20548', '26231', '43848', '15126', '91137', '61265', '98294', '25782', '17920', '18426', '98235', '40081', '84093', '28577', '55565', '17183', '54601', '67897', '22752', '86284', '18376', '38607', '45200', '21756', '29741', '96765', '23932', '89360', '29839', '25989', '28898', '91068', '72550', '10390', '18845', '47770', '82636', '41367', '76638', '86198',  [...]
-|     runtime filters: RF006[bloom] -> substring(ca_zip, 1, 5)
 |     stored statistics:
 |       table: rows=50.00K size=1.16MB
 |       columns: all
diff --git a/testdata/workloads/functional-planner/queries/PlannerTest/tpcds/tpcds-q14a.test b/testdata/workloads/functional-planner/queries/PlannerTest/tpcds/tpcds-q14a.test
index 53de25f..6abbd89 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/tpcds/tpcds-q14a.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/tpcds/tpcds-q14a.test
@@ -101,10 +101,10 @@ with  cross_items as
  order by channel,i_brand_id,i_class_id,i_category_id
 LIMIT 100
 ---- PLAN
-Max Per-Host Resource Reservation: Memory=128.62MB Threads=16
+Max Per-Host Resource Reservation: Memory=130.75MB Threads=16
 Per-Host Resource Estimates: Memory=1.19GB
 F00:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
-|  Per-Host Resources: mem-estimate=1.19GB mem-reservation=128.62MB thread-reservation=16 runtime-filters-memory=10.00MB
+|  Per-Host Resources: mem-estimate=1.19GB mem-reservation=130.75MB thread-reservation=16 runtime-filters-memory=10.00MB
 PLAN-ROOT SINK
 |  output exprs: CASE valid_tid(104,105,106,107,108) WHEN 104 THEN channel WHEN 105 THEN channel WHEN 106 THEN channel WHEN 107 THEN channel WHEN 108 THEN NULL END, CASE valid_tid(104,105,106,107,108) WHEN 104 THEN i_brand_id WHEN 105 THEN i_brand_id WHEN 106 THEN i_brand_id WHEN 107 THEN NULL WHEN 108 THEN NULL END, CASE valid_tid(104,105,106,107,108) WHEN 104 THEN i_class_id WHEN 105 THEN i_class_id WHEN 106 THEN NULL WHEN 107 THEN NULL WHEN 108 THEN NULL END, CASE valid_tid(104,105,10 [...]
 |  mem-estimate=0B mem-reservation=0B thread-reservation=0
@@ -272,14 +272,14 @@ PLAN-ROOT SINK
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=170 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 112(GETNEXT), 108(OPEN)
+|  |  |  in pipelines: 112(GETNEXT), 94(OPEN)
 |  |  |
 |  |  109:HASH JOIN [INNER JOIN]
-|  |  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=84,71 row-size=32B cardinality=148.80K
-|  |  |  in pipelines: 108(GETNEXT), 88(OPEN)
+|  |  |  tuple-ids=75,71 row-size=32B cardinality=148.80K
+|  |  |  in pipelines: 94(GETNEXT), 88(OPEN)
 |  |  |
 |  |  |--88:SCAN HDFS [tpcds_parquet.item]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
@@ -291,32 +291,26 @@ PLAN-ROOT SINK
 |  |  |     tuple-ids=71 row-size=20B cardinality=18.00K
 |  |  |     in pipelines: 88(GETNEXT)
 |  |  |
-|  |  108:AGGREGATE [FINALIZE]
-|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=84 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 108(GETNEXT), 89(OPEN)
-|  |  |
-|  |  107:HASH JOIN [LEFT SEMI JOIN]
+|  |  108:HASH JOIN [LEFT SEMI JOIN]
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
 |  |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=72,73,74 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 89(GETNEXT), 106(OPEN)
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 94(GETNEXT), 107(OPEN)
 |  |  |
-|  |  |--106:AGGREGATE [FINALIZE]
+|  |  |--107:AGGREGATE [FINALIZE]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=169 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 106(GETNEXT), 99(OPEN)
+|  |  |  |  in pipelines: 107(GETNEXT), 100(OPEN)
 |  |  |  |
-|  |  |  103:HASH JOIN [INNER JOIN]
+|  |  |  104:HASH JOIN [INNER JOIN]
 |  |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=80,81,82 row-size=40B cardinality=719.38K
-|  |  |  |  in pipelines: 99(GETNEXT), 101(OPEN)
+|  |  |  |  tuple-ids=81,82,83 row-size=40B cardinality=719.38K
+|  |  |  |  in pipelines: 100(GETNEXT), 102(OPEN)
 |  |  |  |
-|  |  |  |--101:SCAN HDFS [tpcds_parquet.date_dim d3]
+|  |  |  |--102:SCAN HDFS [tpcds_parquet.date_dim d3]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -326,56 +320,56 @@ PLAN-ROOT SINK
 |  |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |     tuple-ids=82 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 101(GETNEXT)
+|  |  |  |     tuple-ids=83 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 102(GETNEXT)
 |  |  |  |
-|  |  |  102:HASH JOIN [INNER JOIN]
+|  |  |  103:HASH JOIN [INNER JOIN]
 |  |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=80,81 row-size=32B cardinality=719.38K
-|  |  |  |  in pipelines: 99(GETNEXT), 100(OPEN)
+|  |  |  |  tuple-ids=81,82 row-size=32B cardinality=719.38K
+|  |  |  |  in pipelines: 100(GETNEXT), 101(OPEN)
 |  |  |  |
-|  |  |  |--100:SCAN HDFS [tpcds_parquet.item iws]
+|  |  |  |--101:SCAN HDFS [tpcds_parquet.item iws]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |     tuple-ids=81 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 100(GETNEXT)
+|  |  |  |     tuple-ids=82 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 101(GETNEXT)
 |  |  |  |
-|  |  |  99:SCAN HDFS [tpcds_parquet.web_sales]
+|  |  |  100:SCAN HDFS [tpcds_parquet.web_sales]
 |  |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |  |     stored statistics:
 |  |  |       table: rows=719.38K size=45.09MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |  |     mem-estimate=64.00MB mem-reservation=4.00MB thread-reservation=1
-|  |  |     tuple-ids=80 row-size=12B cardinality=719.38K
-|  |  |     in pipelines: 99(GETNEXT)
+|  |  |     tuple-ids=81 row-size=12B cardinality=719.38K
+|  |  |     in pipelines: 100(GETNEXT)
 |  |  |
-|  |  105:HASH JOIN [LEFT SEMI JOIN]
+|  |  106:HASH JOIN [LEFT SEMI JOIN]
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
 |  |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=72,73,74 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 89(GETNEXT), 104(OPEN)
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 94(GETNEXT), 105(OPEN)
 |  |  |
-|  |  |--104:AGGREGATE [FINALIZE]
+|  |  |--105:AGGREGATE [FINALIZE]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=168 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 104(GETNEXT), 94(OPEN)
+|  |  |  |  in pipelines: 105(GETNEXT), 95(OPEN)
 |  |  |  |
-|  |  |  98:HASH JOIN [INNER JOIN]
+|  |  |  99:HASH JOIN [INNER JOIN]
 |  |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=76,77,78 row-size=40B cardinality=1.44M
-|  |  |  |  in pipelines: 94(GETNEXT), 96(OPEN)
+|  |  |  |  tuple-ids=77,78,79 row-size=40B cardinality=1.44M
+|  |  |  |  in pipelines: 95(GETNEXT), 97(OPEN)
 |  |  |  |
-|  |  |  |--96:SCAN HDFS [tpcds_parquet.date_dim d2]
+|  |  |  |--97:SCAN HDFS [tpcds_parquet.date_dim d2]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -385,35 +379,41 @@ PLAN-ROOT SINK
 |  |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |     tuple-ids=78 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 96(GETNEXT)
+|  |  |  |     tuple-ids=79 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 97(GETNEXT)
 |  |  |  |
-|  |  |  97:HASH JOIN [INNER JOIN]
+|  |  |  98:HASH JOIN [INNER JOIN]
 |  |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=76,77 row-size=32B cardinality=1.44M
-|  |  |  |  in pipelines: 94(GETNEXT), 95(OPEN)
+|  |  |  |  tuple-ids=77,78 row-size=32B cardinality=1.44M
+|  |  |  |  in pipelines: 95(GETNEXT), 96(OPEN)
 |  |  |  |
-|  |  |  |--95:SCAN HDFS [tpcds_parquet.item ics]
+|  |  |  |--96:SCAN HDFS [tpcds_parquet.item ics]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |     tuple-ids=77 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 95(GETNEXT)
+|  |  |  |     tuple-ids=78 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 96(GETNEXT)
 |  |  |  |
-|  |  |  94:SCAN HDFS [tpcds_parquet.catalog_sales]
+|  |  |  95:SCAN HDFS [tpcds_parquet.catalog_sales]
 |  |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |  |     stored statistics:
 |  |  |       table: rows=1.44M size=96.62MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |  |     mem-estimate=96.00MB mem-reservation=4.00MB thread-reservation=1
-|  |  |     tuple-ids=76 row-size=12B cardinality=1.44M
-|  |  |     in pipelines: 94(GETNEXT)
+|  |  |     tuple-ids=77 row-size=12B cardinality=1.44M
+|  |  |     in pipelines: 95(GETNEXT)
+|  |  |
+|  |  94:AGGREGATE [FINALIZE]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 94(GETNEXT), 89(OPEN)
 |  |  |
 |  |  93:HASH JOIN [INNER JOIN]
 |  |  |  hash predicates: ss_sold_date_sk = d1.d_date_sk
@@ -637,14 +637,14 @@ PLAN-ROOT SINK
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=148 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 70(GETNEXT), 66(OPEN)
+|  |  |  in pipelines: 70(GETNEXT), 52(OPEN)
 |  |  |
 |  |  67:HASH JOIN [INNER JOIN]
-|  |  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=50,37 row-size=32B cardinality=148.80K
-|  |  |  in pipelines: 66(GETNEXT), 46(OPEN)
+|  |  |  tuple-ids=41,37 row-size=32B cardinality=148.80K
+|  |  |  in pipelines: 52(GETNEXT), 46(OPEN)
 |  |  |
 |  |  |--46:SCAN HDFS [tpcds_parquet.item]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
@@ -656,32 +656,26 @@ PLAN-ROOT SINK
 |  |  |     tuple-ids=37 row-size=20B cardinality=18.00K
 |  |  |     in pipelines: 46(GETNEXT)
 |  |  |
-|  |  66:AGGREGATE [FINALIZE]
-|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=50 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 66(GETNEXT), 47(OPEN)
-|  |  |
-|  |  65:HASH JOIN [LEFT SEMI JOIN]
+|  |  66:HASH JOIN [LEFT SEMI JOIN]
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
 |  |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=38,39,40 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 47(GETNEXT), 64(OPEN)
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 52(GETNEXT), 65(OPEN)
 |  |  |
-|  |  |--64:AGGREGATE [FINALIZE]
+|  |  |--65:AGGREGATE [FINALIZE]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=147 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 64(GETNEXT), 57(OPEN)
+|  |  |  |  in pipelines: 65(GETNEXT), 58(OPEN)
 |  |  |  |
-|  |  |  61:HASH JOIN [INNER JOIN]
+|  |  |  62:HASH JOIN [INNER JOIN]
 |  |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=46,47,48 row-size=40B cardinality=719.38K
-|  |  |  |  in pipelines: 57(GETNEXT), 59(OPEN)
+|  |  |  |  tuple-ids=47,48,49 row-size=40B cardinality=719.38K
+|  |  |  |  in pipelines: 58(GETNEXT), 60(OPEN)
 |  |  |  |
-|  |  |  |--59:SCAN HDFS [tpcds_parquet.date_dim d3]
+|  |  |  |--60:SCAN HDFS [tpcds_parquet.date_dim d3]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -691,56 +685,56 @@ PLAN-ROOT SINK
 |  |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |     tuple-ids=48 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 59(GETNEXT)
+|  |  |  |     tuple-ids=49 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 60(GETNEXT)
 |  |  |  |
-|  |  |  60:HASH JOIN [INNER JOIN]
+|  |  |  61:HASH JOIN [INNER JOIN]
 |  |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=46,47 row-size=32B cardinality=719.38K
-|  |  |  |  in pipelines: 57(GETNEXT), 58(OPEN)
+|  |  |  |  tuple-ids=47,48 row-size=32B cardinality=719.38K
+|  |  |  |  in pipelines: 58(GETNEXT), 59(OPEN)
 |  |  |  |
-|  |  |  |--58:SCAN HDFS [tpcds_parquet.item iws]
+|  |  |  |--59:SCAN HDFS [tpcds_parquet.item iws]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |     tuple-ids=47 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 58(GETNEXT)
+|  |  |  |     tuple-ids=48 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 59(GETNEXT)
 |  |  |  |
-|  |  |  57:SCAN HDFS [tpcds_parquet.web_sales]
+|  |  |  58:SCAN HDFS [tpcds_parquet.web_sales]
 |  |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |  |     stored statistics:
 |  |  |       table: rows=719.38K size=45.09MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |  |     mem-estimate=64.00MB mem-reservation=4.00MB thread-reservation=1
-|  |  |     tuple-ids=46 row-size=12B cardinality=719.38K
-|  |  |     in pipelines: 57(GETNEXT)
+|  |  |     tuple-ids=47 row-size=12B cardinality=719.38K
+|  |  |     in pipelines: 58(GETNEXT)
 |  |  |
-|  |  63:HASH JOIN [LEFT SEMI JOIN]
+|  |  64:HASH JOIN [LEFT SEMI JOIN]
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
 |  |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=38,39,40 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 47(GETNEXT), 62(OPEN)
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 52(GETNEXT), 63(OPEN)
 |  |  |
-|  |  |--62:AGGREGATE [FINALIZE]
+|  |  |--63:AGGREGATE [FINALIZE]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=146 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 62(GETNEXT), 52(OPEN)
+|  |  |  |  in pipelines: 63(GETNEXT), 53(OPEN)
 |  |  |  |
-|  |  |  56:HASH JOIN [INNER JOIN]
+|  |  |  57:HASH JOIN [INNER JOIN]
 |  |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=42,43,44 row-size=40B cardinality=1.44M
-|  |  |  |  in pipelines: 52(GETNEXT), 54(OPEN)
+|  |  |  |  tuple-ids=43,44,45 row-size=40B cardinality=1.44M
+|  |  |  |  in pipelines: 53(GETNEXT), 55(OPEN)
 |  |  |  |
-|  |  |  |--54:SCAN HDFS [tpcds_parquet.date_dim d2]
+|  |  |  |--55:SCAN HDFS [tpcds_parquet.date_dim d2]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -750,35 +744,41 @@ PLAN-ROOT SINK
 |  |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |     tuple-ids=44 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 54(GETNEXT)
+|  |  |  |     tuple-ids=45 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 55(GETNEXT)
 |  |  |  |
-|  |  |  55:HASH JOIN [INNER JOIN]
+|  |  |  56:HASH JOIN [INNER JOIN]
 |  |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=42,43 row-size=32B cardinality=1.44M
-|  |  |  |  in pipelines: 52(GETNEXT), 53(OPEN)
+|  |  |  |  tuple-ids=43,44 row-size=32B cardinality=1.44M
+|  |  |  |  in pipelines: 53(GETNEXT), 54(OPEN)
 |  |  |  |
-|  |  |  |--53:SCAN HDFS [tpcds_parquet.item ics]
+|  |  |  |--54:SCAN HDFS [tpcds_parquet.item ics]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |     tuple-ids=43 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 53(GETNEXT)
+|  |  |  |     tuple-ids=44 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 54(GETNEXT)
 |  |  |  |
-|  |  |  52:SCAN HDFS [tpcds_parquet.catalog_sales]
+|  |  |  53:SCAN HDFS [tpcds_parquet.catalog_sales]
 |  |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |  |     stored statistics:
 |  |  |       table: rows=1.44M size=96.62MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |  |     mem-estimate=96.00MB mem-reservation=4.00MB thread-reservation=1
-|  |  |     tuple-ids=42 row-size=12B cardinality=1.44M
-|  |  |     in pipelines: 52(GETNEXT)
+|  |  |     tuple-ids=43 row-size=12B cardinality=1.44M
+|  |  |     in pipelines: 53(GETNEXT)
+|  |  |
+|  |  52:AGGREGATE [FINALIZE]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 52(GETNEXT), 47(OPEN)
 |  |  |
 |  |  51:HASH JOIN [INNER JOIN]
 |  |  |  hash predicates: ss_sold_date_sk = d1.d_date_sk
@@ -1003,15 +1003,15 @@ PLAN-ROOT SINK
 |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  tuple-ids=126 row-size=8B cardinality=17.98K
-|  |  in pipelines: 28(GETNEXT), 24(OPEN)
+|  |  in pipelines: 28(GETNEXT), 10(OPEN)
 |  |
 |  25:HASH JOIN [INNER JOIN]
-|  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  runtime filters: RF006[bloom] <- i_brand_id, RF007[bloom] <- i_category_id, RF008[bloom] <- i_class_id
 |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=16,3 row-size=32B cardinality=148.80K
-|  |  in pipelines: 24(GETNEXT), 04(OPEN)
+|  |  tuple-ids=7,3 row-size=32B cardinality=148.80K
+|  |  in pipelines: 10(GETNEXT), 04(OPEN)
 |  |
 |  |--04:SCAN HDFS [tpcds_parquet.item]
 |  |     HDFS partitions=1/1 files=1 size=1.73MB
@@ -1023,33 +1023,27 @@ PLAN-ROOT SINK
 |  |     tuple-ids=3 row-size=20B cardinality=18.00K
 |  |     in pipelines: 04(GETNEXT)
 |  |
-|  24:AGGREGATE [FINALIZE]
-|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 24(GETNEXT), 05(OPEN)
-|  |
-|  23:HASH JOIN [LEFT SEMI JOIN]
+|  24:HASH JOIN [LEFT SEMI JOIN]
 |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
 |  |  runtime filters: RF012[bloom] <- iws.i_brand_id, RF013[bloom] <- iws.i_category_id
 |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=4,5,6 row-size=40B cardinality=2.88M
-|  |  in pipelines: 05(GETNEXT), 22(OPEN)
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 10(GETNEXT), 23(OPEN)
 |  |
-|  |--22:AGGREGATE [FINALIZE]
+|  |--23:AGGREGATE [FINALIZE]
 |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  tuple-ids=125 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 22(GETNEXT), 15(OPEN)
+|  |  |  in pipelines: 23(GETNEXT), 16(OPEN)
 |  |  |
-|  |  19:HASH JOIN [INNER JOIN]
+|  |  20:HASH JOIN [INNER JOIN]
 |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=12,13,14 row-size=40B cardinality=719.38K
-|  |  |  in pipelines: 15(GETNEXT), 17(OPEN)
+|  |  |  tuple-ids=13,14,15 row-size=40B cardinality=719.38K
+|  |  |  in pipelines: 16(GETNEXT), 18(OPEN)
 |  |  |
-|  |  |--17:SCAN HDFS [tpcds_parquet.date_dim d3]
+|  |  |--18:SCAN HDFS [tpcds_parquet.date_dim d3]
 |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     stored statistics:
@@ -1059,56 +1053,56 @@ PLAN-ROOT SINK
 |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |     tuple-ids=14 row-size=8B cardinality=7.30K
-|  |  |     in pipelines: 17(GETNEXT)
+|  |  |     tuple-ids=15 row-size=8B cardinality=7.30K
+|  |  |     in pipelines: 18(GETNEXT)
 |  |  |
-|  |  18:HASH JOIN [INNER JOIN]
+|  |  19:HASH JOIN [INNER JOIN]
 |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=12,13 row-size=32B cardinality=719.38K
-|  |  |  in pipelines: 15(GETNEXT), 16(OPEN)
+|  |  |  tuple-ids=13,14 row-size=32B cardinality=719.38K
+|  |  |  in pipelines: 16(GETNEXT), 17(OPEN)
 |  |  |
-|  |  |--16:SCAN HDFS [tpcds_parquet.item iws]
+|  |  |--17:SCAN HDFS [tpcds_parquet.item iws]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |     stored statistics:
 |  |  |       table: rows=18.00K size=1.73MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |     tuple-ids=13 row-size=20B cardinality=18.00K
-|  |  |     in pipelines: 16(GETNEXT)
+|  |  |     tuple-ids=14 row-size=20B cardinality=18.00K
+|  |  |     in pipelines: 17(GETNEXT)
 |  |  |
-|  |  15:SCAN HDFS [tpcds_parquet.web_sales]
+|  |  16:SCAN HDFS [tpcds_parquet.web_sales]
 |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |     stored statistics:
 |  |       table: rows=719.38K size=45.09MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |     mem-estimate=64.00MB mem-reservation=4.00MB thread-reservation=1
-|  |     tuple-ids=12 row-size=12B cardinality=719.38K
-|  |     in pipelines: 15(GETNEXT)
+|  |     tuple-ids=13 row-size=12B cardinality=719.38K
+|  |     in pipelines: 16(GETNEXT)
 |  |
-|  21:HASH JOIN [LEFT SEMI JOIN]
+|  22:HASH JOIN [LEFT SEMI JOIN]
 |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
 |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=4,5,6 row-size=40B cardinality=2.88M
-|  |  in pipelines: 05(GETNEXT), 20(OPEN)
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 10(GETNEXT), 21(OPEN)
 |  |
-|  |--20:AGGREGATE [FINALIZE]
+|  |--21:AGGREGATE [FINALIZE]
 |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  tuple-ids=124 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 20(GETNEXT), 10(OPEN)
+|  |  |  in pipelines: 21(GETNEXT), 11(OPEN)
 |  |  |
-|  |  14:HASH JOIN [INNER JOIN]
+|  |  15:HASH JOIN [INNER JOIN]
 |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=8,9,10 row-size=40B cardinality=1.44M
-|  |  |  in pipelines: 10(GETNEXT), 12(OPEN)
+|  |  |  tuple-ids=9,10,11 row-size=40B cardinality=1.44M
+|  |  |  in pipelines: 11(GETNEXT), 13(OPEN)
 |  |  |
-|  |  |--12:SCAN HDFS [tpcds_parquet.date_dim d2]
+|  |  |--13:SCAN HDFS [tpcds_parquet.date_dim d2]
 |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     stored statistics:
@@ -1118,35 +1112,41 @@ PLAN-ROOT SINK
 |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |     tuple-ids=10 row-size=8B cardinality=7.30K
-|  |  |     in pipelines: 12(GETNEXT)
+|  |  |     tuple-ids=11 row-size=8B cardinality=7.30K
+|  |  |     in pipelines: 13(GETNEXT)
 |  |  |
-|  |  13:HASH JOIN [INNER JOIN]
+|  |  14:HASH JOIN [INNER JOIN]
 |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=8,9 row-size=32B cardinality=1.44M
-|  |  |  in pipelines: 10(GETNEXT), 11(OPEN)
+|  |  |  tuple-ids=9,10 row-size=32B cardinality=1.44M
+|  |  |  in pipelines: 11(GETNEXT), 12(OPEN)
 |  |  |
-|  |  |--11:SCAN HDFS [tpcds_parquet.item ics]
+|  |  |--12:SCAN HDFS [tpcds_parquet.item ics]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |     stored statistics:
 |  |  |       table: rows=18.00K size=1.73MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |     tuple-ids=9 row-size=20B cardinality=18.00K
-|  |  |     in pipelines: 11(GETNEXT)
+|  |  |     tuple-ids=10 row-size=20B cardinality=18.00K
+|  |  |     in pipelines: 12(GETNEXT)
 |  |  |
-|  |  10:SCAN HDFS [tpcds_parquet.catalog_sales]
+|  |  11:SCAN HDFS [tpcds_parquet.catalog_sales]
 |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |     stored statistics:
 |  |       table: rows=1.44M size=96.62MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |     mem-estimate=96.00MB mem-reservation=4.00MB thread-reservation=1
-|  |     tuple-ids=8 row-size=12B cardinality=1.44M
-|  |     in pipelines: 10(GETNEXT)
+|  |     tuple-ids=9 row-size=12B cardinality=1.44M
+|  |     in pipelines: 11(GETNEXT)
+|  |
+|  10:AGGREGATE [FINALIZE]
+|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 10(GETNEXT), 05(OPEN)
 |  |
 |  09:HASH JOIN [INNER JOIN]
 |  |  hash predicates: ss_sold_date_sk = d1.d_date_sk
@@ -1249,8 +1249,8 @@ PLAN-ROOT SINK
    tuple-ids=0 row-size=20B cardinality=2.88M
    in pipelines: 01(GETNEXT)
 ---- DISTRIBUTEDPLAN
-Max Per-Host Resource Reservation: Memory=396.69MB Threads=120
-Per-Host Resource Estimates: Memory=3.67GB
+Max Per-Host Resource Reservation: Memory=391.06MB Threads=120
+Per-Host Resource Estimates: Memory=3.66GB
 F80:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=16.80KB mem-reservation=0B thread-reservation=1
 PLAN-ROOT SINK
@@ -1518,27 +1518,27 @@ Per-Host Resources: mem-estimate=111.57MB mem-reservation=79.75MB thread-reserva
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=170 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 204(GETNEXT), 201(OPEN)
+|  |  |  in pipelines: 204(GETNEXT), 191(OPEN)
 |  |  |
 |  |  203:EXCHANGE [HASH(tpcds_parquet.item.i_item_sk)]
 |  |  |  mem-estimate=82.81KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=170 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 201(GETNEXT)
+|  |  |  in pipelines: 191(GETNEXT)
 |  |  |
-|  |  F66:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=3
-|  |  Per-Host Resources: mem-estimate=22.92MB mem-reservation=5.88MB thread-reservation=1
+|  |  F58:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=3
+|  |  Per-Host Resources: mem-estimate=28.29MB mem-reservation=9.75MB thread-reservation=1
 |  |  112:AGGREGATE [STREAMING]
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=170 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 201(GETNEXT)
+|  |  |  in pipelines: 191(GETNEXT)
 |  |  |
 |  |  109:HASH JOIN [INNER JOIN, PARTITIONED]
-|  |  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=84,71 row-size=32B cardinality=148.80K
-|  |  |  in pipelines: 201(GETNEXT), 88(OPEN)
+|  |  |  tuple-ids=75,71 row-size=32B cardinality=148.80K
+|  |  |  in pipelines: 191(GETNEXT), 88(OPEN)
 |  |  |
 |  |  |--202:EXCHANGE [HASH(i_brand_id,i_class_id,i_category_id)]
 |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
@@ -1557,72 +1557,53 @@ Per-Host Resources: mem-estimate=111.57MB mem-reservation=79.75MB thread-reserva
 |  |  |     tuple-ids=71 row-size=20B cardinality=18.00K
 |  |  |     in pipelines: 88(GETNEXT)
 |  |  |
-|  |  201:AGGREGATE [FINALIZE]
-|  |  |  group by: $a$2.brand_id, $a$2.class_id, $a$2.category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=84 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 201(GETNEXT), 89(OPEN)
-|  |  |
-|  |  200:EXCHANGE [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)]
-|  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
-|  |  |  tuple-ids=84 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 89(GETNEXT)
-|  |  |
-|  |  F55:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  Per-Host Resources: mem-estimate=39.54MB mem-reservation=13.12MB thread-reservation=2
-|  |  108:AGGREGATE [STREAMING]
-|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=84 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 89(GETNEXT)
-|  |  |
-|  |  107:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  108:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
-|  |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=72,73,74 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 89(GETNEXT), 198(OPEN)
+|  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 191(GETNEXT), 200(OPEN)
 |  |  |
-|  |  |--199:EXCHANGE [BROADCAST]
-|  |  |  |  mem-estimate=1.73MB mem-reservation=0B thread-reservation=0
+|  |  |--201:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=169 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 198(GETNEXT)
+|  |  |  |  in pipelines: 200(GETNEXT)
 |  |  |  |
-|  |  |  F65:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
+|  |  |  F66:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
 |  |  |  Per-Host Resources: mem-estimate=10.88MB mem-reservation=1.94MB thread-reservation=1
-|  |  |  198:AGGREGATE [FINALIZE]
+|  |  |  200:AGGREGATE [FINALIZE]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  tuple-ids=169 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 198(GETNEXT), 99(OPEN)
+|  |  |  |  in pipelines: 200(GETNEXT), 100(OPEN)
 |  |  |  |
-|  |  |  197:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  199:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
 |  |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=169 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 99(GETNEXT)
+|  |  |  |  in pipelines: 100(GETNEXT)
 |  |  |  |
-|  |  |  F62:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
+|  |  |  F63:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  Per-Host Resources: mem-estimate=78.31MB mem-reservation=10.88MB thread-reservation=2
-|  |  |  106:AGGREGATE [STREAMING]
+|  |  |  107:AGGREGATE [STREAMING]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=169 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 99(GETNEXT)
+|  |  |  |  in pipelines: 100(GETNEXT)
 |  |  |  |
-|  |  |  103:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  104:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=80,81,82 row-size=40B cardinality=719.38K
-|  |  |  |  in pipelines: 99(GETNEXT), 101(OPEN)
+|  |  |  |  tuple-ids=81,82,83 row-size=40B cardinality=719.38K
+|  |  |  |  in pipelines: 100(GETNEXT), 102(OPEN)
 |  |  |  |
-|  |  |  |--196:EXCHANGE [BROADCAST]
+|  |  |  |--198:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=82 row-size=8B cardinality=7.30K
-|  |  |  |  |  in pipelines: 101(GETNEXT)
+|  |  |  |  |  tuple-ids=83 row-size=8B cardinality=7.30K
+|  |  |  |  |  in pipelines: 102(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F64:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F65:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Host Resources: mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=2
-|  |  |  |  101:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
+|  |  |  |  102:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -1632,90 +1613,90 @@ Per-Host Resources: mem-estimate=111.57MB mem-reservation=79.75MB thread-reserva
 |  |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |     tuple-ids=82 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 101(GETNEXT)
+|  |  |  |     tuple-ids=83 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 102(GETNEXT)
 |  |  |  |
-|  |  |  102:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  103:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=80,81 row-size=32B cardinality=719.38K
-|  |  |  |  in pipelines: 99(GETNEXT), 100(OPEN)
+|  |  |  |  tuple-ids=81,82 row-size=32B cardinality=719.38K
+|  |  |  |  in pipelines: 100(GETNEXT), 101(OPEN)
 |  |  |  |
-|  |  |  |--195:EXCHANGE [BROADCAST]
+|  |  |  |--197:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=81 row-size=20B cardinality=18.00K
-|  |  |  |  |  in pipelines: 100(GETNEXT)
+|  |  |  |  |  tuple-ids=82 row-size=20B cardinality=18.00K
+|  |  |  |  |  in pipelines: 101(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F63:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F64:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Host Resources: mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=2
-|  |  |  |  100:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
+|  |  |  |  101:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |     tuple-ids=81 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 100(GETNEXT)
+|  |  |  |     tuple-ids=82 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 101(GETNEXT)
 |  |  |  |
-|  |  |  99:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
+|  |  |  100:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
 |  |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |  |     stored statistics:
 |  |  |       table: rows=719.38K size=45.09MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |  |     mem-estimate=64.00MB mem-reservation=4.00MB thread-reservation=1
-|  |  |     tuple-ids=80 row-size=12B cardinality=719.38K
-|  |  |     in pipelines: 99(GETNEXT)
+|  |  |     tuple-ids=81 row-size=12B cardinality=719.38K
+|  |  |     in pipelines: 100(GETNEXT)
 |  |  |
-|  |  105:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  106:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
-|  |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=72,73,74 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 89(GETNEXT), 193(OPEN)
+|  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 191(GETNEXT), 195(OPEN)
 |  |  |
-|  |  |--194:EXCHANGE [BROADCAST]
-|  |  |  |  mem-estimate=1.75MB mem-reservation=0B thread-reservation=0
+|  |  |--196:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=168 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 193(GETNEXT)
+|  |  |  |  in pipelines: 195(GETNEXT)
 |  |  |  |
-|  |  |  F61:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
+|  |  |  F62:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
 |  |  |  Per-Host Resources: mem-estimate=10.61MB mem-reservation=1.94MB thread-reservation=1
-|  |  |  193:AGGREGATE [FINALIZE]
+|  |  |  195:AGGREGATE [FINALIZE]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  tuple-ids=168 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 193(GETNEXT), 94(OPEN)
+|  |  |  |  in pipelines: 195(GETNEXT), 95(OPEN)
 |  |  |  |
-|  |  |  192:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  194:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
 |  |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=168 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 94(GETNEXT)
+|  |  |  |  in pipelines: 95(GETNEXT)
 |  |  |  |
-|  |  |  F58:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  |  F59:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  Per-Host Resources: mem-estimate=110.31MB mem-reservation=10.88MB thread-reservation=2
-|  |  |  104:AGGREGATE [STREAMING]
+|  |  |  105:AGGREGATE [STREAMING]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=168 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 94(GETNEXT)
+|  |  |  |  in pipelines: 95(GETNEXT)
 |  |  |  |
-|  |  |  98:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  99:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=76,77,78 row-size=40B cardinality=1.44M
-|  |  |  |  in pipelines: 94(GETNEXT), 96(OPEN)
+|  |  |  |  tuple-ids=77,78,79 row-size=40B cardinality=1.44M
+|  |  |  |  in pipelines: 95(GETNEXT), 97(OPEN)
 |  |  |  |
-|  |  |  |--191:EXCHANGE [BROADCAST]
+|  |  |  |--193:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=78 row-size=8B cardinality=7.30K
-|  |  |  |  |  in pipelines: 96(GETNEXT)
+|  |  |  |  |  tuple-ids=79 row-size=8B cardinality=7.30K
+|  |  |  |  |  in pipelines: 97(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F60:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F61:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Host Resources: mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=2
-|  |  |  |  96:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
+|  |  |  |  97:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -1725,42 +1706,61 @@ Per-Host Resources: mem-estimate=111.57MB mem-reservation=79.75MB thread-reserva
 |  |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |     tuple-ids=78 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 96(GETNEXT)
+|  |  |  |     tuple-ids=79 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 97(GETNEXT)
 |  |  |  |
-|  |  |  97:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  98:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=76,77 row-size=32B cardinality=1.44M
-|  |  |  |  in pipelines: 94(GETNEXT), 95(OPEN)
+|  |  |  |  tuple-ids=77,78 row-size=32B cardinality=1.44M
+|  |  |  |  in pipelines: 95(GETNEXT), 96(OPEN)
 |  |  |  |
-|  |  |  |--190:EXCHANGE [BROADCAST]
+|  |  |  |--192:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=77 row-size=20B cardinality=18.00K
-|  |  |  |  |  in pipelines: 95(GETNEXT)
+|  |  |  |  |  tuple-ids=78 row-size=20B cardinality=18.00K
+|  |  |  |  |  in pipelines: 96(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F59:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F60:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Host Resources: mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=2
-|  |  |  |  95:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
+|  |  |  |  96:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |     tuple-ids=77 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 95(GETNEXT)
+|  |  |  |     tuple-ids=78 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 96(GETNEXT)
 |  |  |  |
-|  |  |  94:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
+|  |  |  95:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
 |  |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |  |     stored statistics:
 |  |  |       table: rows=1.44M size=96.62MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |  |     mem-estimate=96.00MB mem-reservation=4.00MB thread-reservation=1
-|  |  |     tuple-ids=76 row-size=12B cardinality=1.44M
-|  |  |     in pipelines: 94(GETNEXT)
+|  |  |     tuple-ids=77 row-size=12B cardinality=1.44M
+|  |  |     in pipelines: 95(GETNEXT)
+|  |  |
+|  |  191:AGGREGATE [FINALIZE]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 191(GETNEXT), 89(OPEN)
+|  |  |
+|  |  190:EXCHANGE [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)]
+|  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 89(GETNEXT)
+|  |  |
+|  |  F55:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  Per-Host Resources: mem-estimate=30.31MB mem-reservation=7.38MB thread-reservation=2
+|  |  94:AGGREGATE [STREAMING]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 89(GETNEXT)
 |  |  |
 |  |  93:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash predicates: ss_sold_date_sk = d1.d_date_sk
@@ -2074,27 +2074,27 @@ Per-Host Resources: mem-estimate=111.57MB mem-reservation=79.75MB thread-reserva
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=148 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 176(GETNEXT), 173(OPEN)
+|  |  |  in pipelines: 176(GETNEXT), 163(OPEN)
 |  |  |
 |  |  175:EXCHANGE [HASH(tpcds_parquet.item.i_item_sk)]
 |  |  |  mem-estimate=82.81KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=148 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 173(GETNEXT)
+|  |  |  in pipelines: 163(GETNEXT)
 |  |  |
-|  |  F40:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=3
-|  |  Per-Host Resources: mem-estimate=22.92MB mem-reservation=5.88MB thread-reservation=1
+|  |  F32:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=3
+|  |  Per-Host Resources: mem-estimate=28.29MB mem-reservation=9.75MB thread-reservation=1
 |  |  70:AGGREGATE [STREAMING]
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=148 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 173(GETNEXT)
+|  |  |  in pipelines: 163(GETNEXT)
 |  |  |
 |  |  67:HASH JOIN [INNER JOIN, PARTITIONED]
-|  |  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=50,37 row-size=32B cardinality=148.80K
-|  |  |  in pipelines: 173(GETNEXT), 46(OPEN)
+|  |  |  tuple-ids=41,37 row-size=32B cardinality=148.80K
+|  |  |  in pipelines: 163(GETNEXT), 46(OPEN)
 |  |  |
 |  |  |--174:EXCHANGE [HASH(i_brand_id,i_class_id,i_category_id)]
 |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
@@ -2113,72 +2113,53 @@ Per-Host Resources: mem-estimate=111.57MB mem-reservation=79.75MB thread-reserva
 |  |  |     tuple-ids=37 row-size=20B cardinality=18.00K
 |  |  |     in pipelines: 46(GETNEXT)
 |  |  |
-|  |  173:AGGREGATE [FINALIZE]
-|  |  |  group by: $a$2.brand_id, $a$2.class_id, $a$2.category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=50 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 173(GETNEXT), 47(OPEN)
-|  |  |
-|  |  172:EXCHANGE [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)]
-|  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
-|  |  |  tuple-ids=50 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 47(GETNEXT)
-|  |  |
-|  |  F29:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  Per-Host Resources: mem-estimate=39.54MB mem-reservation=13.12MB thread-reservation=2
-|  |  66:AGGREGATE [STREAMING]
-|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=50 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 47(GETNEXT)
-|  |  |
-|  |  65:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  66:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
-|  |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=38,39,40 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 47(GETNEXT), 170(OPEN)
+|  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 163(GETNEXT), 172(OPEN)
 |  |  |
-|  |  |--171:EXCHANGE [BROADCAST]
-|  |  |  |  mem-estimate=1.73MB mem-reservation=0B thread-reservation=0
+|  |  |--173:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=147 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 170(GETNEXT)
+|  |  |  |  in pipelines: 172(GETNEXT)
 |  |  |  |
-|  |  |  F39:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
+|  |  |  F40:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
 |  |  |  Per-Host Resources: mem-estimate=10.88MB mem-reservation=1.94MB thread-reservation=1
-|  |  |  170:AGGREGATE [FINALIZE]
+|  |  |  172:AGGREGATE [FINALIZE]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  tuple-ids=147 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 170(GETNEXT), 57(OPEN)
+|  |  |  |  in pipelines: 172(GETNEXT), 58(OPEN)
 |  |  |  |
-|  |  |  169:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  171:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
 |  |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=147 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 57(GETNEXT)
+|  |  |  |  in pipelines: 58(GETNEXT)
 |  |  |  |
-|  |  |  F36:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
+|  |  |  F37:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  Per-Host Resources: mem-estimate=78.31MB mem-reservation=10.88MB thread-reservation=2
-|  |  |  64:AGGREGATE [STREAMING]
+|  |  |  65:AGGREGATE [STREAMING]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=147 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 57(GETNEXT)
+|  |  |  |  in pipelines: 58(GETNEXT)
 |  |  |  |
-|  |  |  61:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  62:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=46,47,48 row-size=40B cardinality=719.38K
-|  |  |  |  in pipelines: 57(GETNEXT), 59(OPEN)
+|  |  |  |  tuple-ids=47,48,49 row-size=40B cardinality=719.38K
+|  |  |  |  in pipelines: 58(GETNEXT), 60(OPEN)
 |  |  |  |
-|  |  |  |--168:EXCHANGE [BROADCAST]
+|  |  |  |--170:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=48 row-size=8B cardinality=7.30K
-|  |  |  |  |  in pipelines: 59(GETNEXT)
+|  |  |  |  |  tuple-ids=49 row-size=8B cardinality=7.30K
+|  |  |  |  |  in pipelines: 60(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F38:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F39:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Host Resources: mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=2
-|  |  |  |  59:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
+|  |  |  |  60:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -2188,90 +2169,90 @@ Per-Host Resources: mem-estimate=111.57MB mem-reservation=79.75MB thread-reserva
 |  |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |     tuple-ids=48 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 59(GETNEXT)
+|  |  |  |     tuple-ids=49 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 60(GETNEXT)
 |  |  |  |
-|  |  |  60:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  61:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=46,47 row-size=32B cardinality=719.38K
-|  |  |  |  in pipelines: 57(GETNEXT), 58(OPEN)
+|  |  |  |  tuple-ids=47,48 row-size=32B cardinality=719.38K
+|  |  |  |  in pipelines: 58(GETNEXT), 59(OPEN)
 |  |  |  |
-|  |  |  |--167:EXCHANGE [BROADCAST]
+|  |  |  |--169:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=47 row-size=20B cardinality=18.00K
-|  |  |  |  |  in pipelines: 58(GETNEXT)
+|  |  |  |  |  tuple-ids=48 row-size=20B cardinality=18.00K
+|  |  |  |  |  in pipelines: 59(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F37:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F38:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Host Resources: mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=2
-|  |  |  |  58:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
+|  |  |  |  59:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |     tuple-ids=47 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 58(GETNEXT)
+|  |  |  |     tuple-ids=48 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 59(GETNEXT)
 |  |  |  |
-|  |  |  57:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
+|  |  |  58:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
 |  |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |  |     stored statistics:
 |  |  |       table: rows=719.38K size=45.09MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |  |     mem-estimate=64.00MB mem-reservation=4.00MB thread-reservation=1
-|  |  |     tuple-ids=46 row-size=12B cardinality=719.38K
-|  |  |     in pipelines: 57(GETNEXT)
+|  |  |     tuple-ids=47 row-size=12B cardinality=719.38K
+|  |  |     in pipelines: 58(GETNEXT)
 |  |  |
-|  |  63:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  64:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
-|  |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=38,39,40 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 47(GETNEXT), 165(OPEN)
+|  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 163(GETNEXT), 167(OPEN)
 |  |  |
-|  |  |--166:EXCHANGE [BROADCAST]
-|  |  |  |  mem-estimate=1.75MB mem-reservation=0B thread-reservation=0
+|  |  |--168:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=146 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 165(GETNEXT)
+|  |  |  |  in pipelines: 167(GETNEXT)
 |  |  |  |
-|  |  |  F35:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
+|  |  |  F36:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
 |  |  |  Per-Host Resources: mem-estimate=10.61MB mem-reservation=1.94MB thread-reservation=1
-|  |  |  165:AGGREGATE [FINALIZE]
+|  |  |  167:AGGREGATE [FINALIZE]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  tuple-ids=146 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 165(GETNEXT), 52(OPEN)
+|  |  |  |  in pipelines: 167(GETNEXT), 53(OPEN)
 |  |  |  |
-|  |  |  164:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  166:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
 |  |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=146 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 52(GETNEXT)
+|  |  |  |  in pipelines: 53(GETNEXT)
 |  |  |  |
-|  |  |  F32:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  |  F33:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  Per-Host Resources: mem-estimate=110.31MB mem-reservation=10.88MB thread-reservation=2
-|  |  |  62:AGGREGATE [STREAMING]
+|  |  |  63:AGGREGATE [STREAMING]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=146 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 52(GETNEXT)
+|  |  |  |  in pipelines: 53(GETNEXT)
 |  |  |  |
-|  |  |  56:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  57:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=42,43,44 row-size=40B cardinality=1.44M
-|  |  |  |  in pipelines: 52(GETNEXT), 54(OPEN)
+|  |  |  |  tuple-ids=43,44,45 row-size=40B cardinality=1.44M
+|  |  |  |  in pipelines: 53(GETNEXT), 55(OPEN)
 |  |  |  |
-|  |  |  |--163:EXCHANGE [BROADCAST]
+|  |  |  |--165:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=44 row-size=8B cardinality=7.30K
-|  |  |  |  |  in pipelines: 54(GETNEXT)
+|  |  |  |  |  tuple-ids=45 row-size=8B cardinality=7.30K
+|  |  |  |  |  in pipelines: 55(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F34:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F35:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Host Resources: mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=2
-|  |  |  |  54:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
+|  |  |  |  55:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -2281,42 +2262,61 @@ Per-Host Resources: mem-estimate=111.57MB mem-reservation=79.75MB thread-reserva
 |  |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |     tuple-ids=44 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 54(GETNEXT)
+|  |  |  |     tuple-ids=45 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 55(GETNEXT)
 |  |  |  |
-|  |  |  55:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  56:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=42,43 row-size=32B cardinality=1.44M
-|  |  |  |  in pipelines: 52(GETNEXT), 53(OPEN)
+|  |  |  |  tuple-ids=43,44 row-size=32B cardinality=1.44M
+|  |  |  |  in pipelines: 53(GETNEXT), 54(OPEN)
 |  |  |  |
-|  |  |  |--162:EXCHANGE [BROADCAST]
+|  |  |  |--164:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=43 row-size=20B cardinality=18.00K
-|  |  |  |  |  in pipelines: 53(GETNEXT)
+|  |  |  |  |  tuple-ids=44 row-size=20B cardinality=18.00K
+|  |  |  |  |  in pipelines: 54(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F33:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F34:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Host Resources: mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=2
-|  |  |  |  53:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
+|  |  |  |  54:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |     tuple-ids=43 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 53(GETNEXT)
+|  |  |  |     tuple-ids=44 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 54(GETNEXT)
 |  |  |  |
-|  |  |  52:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
+|  |  |  53:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
 |  |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |  |     stored statistics:
 |  |  |       table: rows=1.44M size=96.62MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |  |     mem-estimate=96.00MB mem-reservation=4.00MB thread-reservation=1
-|  |  |     tuple-ids=42 row-size=12B cardinality=1.44M
-|  |  |     in pipelines: 52(GETNEXT)
+|  |  |     tuple-ids=43 row-size=12B cardinality=1.44M
+|  |  |     in pipelines: 53(GETNEXT)
+|  |  |
+|  |  163:AGGREGATE [FINALIZE]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 163(GETNEXT), 47(OPEN)
+|  |  |
+|  |  162:EXCHANGE [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)]
+|  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 47(GETNEXT)
+|  |  |
+|  |  F29:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  Per-Host Resources: mem-estimate=30.31MB mem-reservation=7.38MB thread-reservation=2
+|  |  52:AGGREGATE [STREAMING]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 47(GETNEXT)
 |  |  |
 |  |  51:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash predicates: ss_sold_date_sk = d1.d_date_sk
@@ -2631,28 +2631,28 @@ Per-Host Resources: mem-estimate=67.37MB mem-reservation=14.81MB thread-reservat
 |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  tuple-ids=126 row-size=8B cardinality=17.98K
-|  |  in pipelines: 148(GETNEXT), 145(OPEN)
+|  |  in pipelines: 148(GETNEXT), 135(OPEN)
 |  |
 |  147:EXCHANGE [HASH(tpcds_parquet.item.i_item_sk)]
 |  |  mem-estimate=82.81KB mem-reservation=0B thread-reservation=0
 |  |  tuple-ids=126 row-size=8B cardinality=17.98K
-|  |  in pipelines: 145(GETNEXT)
+|  |  in pipelines: 135(GETNEXT)
 |  |
-|  F14:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=3
-|  Per-Host Resources: mem-estimate=25.92MB mem-reservation=8.88MB thread-reservation=1 runtime-filters-memory=3.00MB
+|  F06:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=3
+|  Per-Host Resources: mem-estimate=33.29MB mem-reservation=14.75MB thread-reservation=1 runtime-filters-memory=5.00MB
 |  28:AGGREGATE [STREAMING]
 |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
 |  |  tuple-ids=126 row-size=8B cardinality=17.98K
-|  |  in pipelines: 145(GETNEXT)
+|  |  in pipelines: 135(GETNEXT)
 |  |
 |  25:HASH JOIN [INNER JOIN, PARTITIONED]
-|  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  runtime filters: RF006[bloom] <- i_brand_id, RF007[bloom] <- i_category_id, RF008[bloom] <- i_class_id
 |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=16,3 row-size=32B cardinality=148.80K
-|  |  in pipelines: 145(GETNEXT), 04(OPEN)
+|  |  tuple-ids=7,3 row-size=32B cardinality=148.80K
+|  |  in pipelines: 135(GETNEXT), 04(OPEN)
 |  |
 |  |--146:EXCHANGE [HASH(i_brand_id,i_class_id,i_category_id)]
 |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
@@ -2671,73 +2671,54 @@ Per-Host Resources: mem-estimate=67.37MB mem-reservation=14.81MB thread-reservat
 |  |     tuple-ids=3 row-size=20B cardinality=18.00K
 |  |     in pipelines: 04(GETNEXT)
 |  |
-|  145:AGGREGATE [FINALIZE]
-|  |  group by: $a$2.brand_id, $a$2.class_id, $a$2.category_id
-|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 145(GETNEXT), 05(OPEN)
-|  |
-|  144:EXCHANGE [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)]
-|  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 05(GETNEXT)
-|  |
-|  F03:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  Per-Host Resources: mem-estimate=41.54MB mem-reservation=15.12MB thread-reservation=2 runtime-filters-memory=2.00MB
-|  24:AGGREGATE [STREAMING]
-|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 05(GETNEXT)
-|  |
-|  23:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  24:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
 |  |  runtime filters: RF012[bloom] <- iws.i_brand_id, RF013[bloom] <- iws.i_category_id
-|  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=4,5,6 row-size=40B cardinality=2.88M
-|  |  in pipelines: 05(GETNEXT), 142(OPEN)
+|  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 135(GETNEXT), 144(OPEN)
 |  |
-|  |--143:EXCHANGE [BROADCAST]
-|  |  |  mem-estimate=1.73MB mem-reservation=0B thread-reservation=0
+|  |--145:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=125 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 142(GETNEXT)
+|  |  |  in pipelines: 144(GETNEXT)
 |  |  |
-|  |  F13:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
+|  |  F14:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
 |  |  Per-Host Resources: mem-estimate=10.88MB mem-reservation=1.94MB thread-reservation=1
-|  |  142:AGGREGATE [FINALIZE]
+|  |  144:AGGREGATE [FINALIZE]
 |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=125 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 142(GETNEXT), 15(OPEN)
+|  |  |  in pipelines: 144(GETNEXT), 16(OPEN)
 |  |  |
-|  |  141:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  143:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
 |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=125 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 15(GETNEXT)
+|  |  |  in pipelines: 16(GETNEXT)
 |  |  |
-|  |  F10:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
+|  |  F11:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  Per-Host Resources: mem-estimate=78.31MB mem-reservation=10.88MB thread-reservation=2
-|  |  22:AGGREGATE [STREAMING]
+|  |  23:AGGREGATE [STREAMING]
 |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  tuple-ids=125 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 15(GETNEXT)
+|  |  |  in pipelines: 16(GETNEXT)
 |  |  |
-|  |  19:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  20:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=12,13,14 row-size=40B cardinality=719.38K
-|  |  |  in pipelines: 15(GETNEXT), 17(OPEN)
+|  |  |  tuple-ids=13,14,15 row-size=40B cardinality=719.38K
+|  |  |  in pipelines: 16(GETNEXT), 18(OPEN)
 |  |  |
-|  |  |--140:EXCHANGE [BROADCAST]
+|  |  |--142:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=14 row-size=8B cardinality=7.30K
-|  |  |  |  in pipelines: 17(GETNEXT)
+|  |  |  |  tuple-ids=15 row-size=8B cardinality=7.30K
+|  |  |  |  in pipelines: 18(GETNEXT)
 |  |  |  |
-|  |  |  F12:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F13:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Host Resources: mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=2
-|  |  |  17:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
+|  |  |  18:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     stored statistics:
@@ -2747,90 +2728,90 @@ Per-Host Resources: mem-estimate=67.37MB mem-reservation=14.81MB thread-reservat
 |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |     tuple-ids=14 row-size=8B cardinality=7.30K
-|  |  |     in pipelines: 17(GETNEXT)
+|  |  |     tuple-ids=15 row-size=8B cardinality=7.30K
+|  |  |     in pipelines: 18(GETNEXT)
 |  |  |
-|  |  18:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  19:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=12,13 row-size=32B cardinality=719.38K
-|  |  |  in pipelines: 15(GETNEXT), 16(OPEN)
+|  |  |  tuple-ids=13,14 row-size=32B cardinality=719.38K
+|  |  |  in pipelines: 16(GETNEXT), 17(OPEN)
 |  |  |
-|  |  |--139:EXCHANGE [BROADCAST]
+|  |  |--141:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=13 row-size=20B cardinality=18.00K
-|  |  |  |  in pipelines: 16(GETNEXT)
+|  |  |  |  tuple-ids=14 row-size=20B cardinality=18.00K
+|  |  |  |  in pipelines: 17(GETNEXT)
 |  |  |  |
-|  |  |  F11:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F12:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Host Resources: mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=2
-|  |  |  16:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
+|  |  |  17:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |     stored statistics:
 |  |  |       table: rows=18.00K size=1.73MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |     tuple-ids=13 row-size=20B cardinality=18.00K
-|  |  |     in pipelines: 16(GETNEXT)
+|  |  |     tuple-ids=14 row-size=20B cardinality=18.00K
+|  |  |     in pipelines: 17(GETNEXT)
 |  |  |
-|  |  15:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
+|  |  16:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
 |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |     stored statistics:
 |  |       table: rows=719.38K size=45.09MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |     mem-estimate=64.00MB mem-reservation=4.00MB thread-reservation=1
-|  |     tuple-ids=12 row-size=12B cardinality=719.38K
-|  |     in pipelines: 15(GETNEXT)
+|  |     tuple-ids=13 row-size=12B cardinality=719.38K
+|  |     in pipelines: 16(GETNEXT)
 |  |
-|  21:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  22:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
-|  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=4,5,6 row-size=40B cardinality=2.88M
-|  |  in pipelines: 05(GETNEXT), 137(OPEN)
+|  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 135(GETNEXT), 139(OPEN)
 |  |
-|  |--138:EXCHANGE [BROADCAST]
-|  |  |  mem-estimate=1.75MB mem-reservation=0B thread-reservation=0
+|  |--140:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=124 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 137(GETNEXT)
+|  |  |  in pipelines: 139(GETNEXT)
 |  |  |
-|  |  F09:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
+|  |  F10:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
 |  |  Per-Host Resources: mem-estimate=10.61MB mem-reservation=1.94MB thread-reservation=1
-|  |  137:AGGREGATE [FINALIZE]
+|  |  139:AGGREGATE [FINALIZE]
 |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=124 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 137(GETNEXT), 10(OPEN)
+|  |  |  in pipelines: 139(GETNEXT), 11(OPEN)
 |  |  |
-|  |  136:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  138:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
 |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=124 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 10(GETNEXT)
+|  |  |  in pipelines: 11(GETNEXT)
 |  |  |
-|  |  F06:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  F07:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  Per-Host Resources: mem-estimate=110.31MB mem-reservation=10.88MB thread-reservation=2
-|  |  20:AGGREGATE [STREAMING]
+|  |  21:AGGREGATE [STREAMING]
 |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  tuple-ids=124 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 10(GETNEXT)
+|  |  |  in pipelines: 11(GETNEXT)
 |  |  |
-|  |  14:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  15:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=8,9,10 row-size=40B cardinality=1.44M
-|  |  |  in pipelines: 10(GETNEXT), 12(OPEN)
+|  |  |  tuple-ids=9,10,11 row-size=40B cardinality=1.44M
+|  |  |  in pipelines: 11(GETNEXT), 13(OPEN)
 |  |  |
-|  |  |--135:EXCHANGE [BROADCAST]
+|  |  |--137:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=10 row-size=8B cardinality=7.30K
-|  |  |  |  in pipelines: 12(GETNEXT)
+|  |  |  |  tuple-ids=11 row-size=8B cardinality=7.30K
+|  |  |  |  in pipelines: 13(GETNEXT)
 |  |  |  |
-|  |  |  F08:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F09:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Host Resources: mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=2
-|  |  |  12:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
+|  |  |  13:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     stored statistics:
@@ -2840,42 +2821,61 @@ Per-Host Resources: mem-estimate=67.37MB mem-reservation=14.81MB thread-reservat
 |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |     tuple-ids=10 row-size=8B cardinality=7.30K
-|  |  |     in pipelines: 12(GETNEXT)
+|  |  |     tuple-ids=11 row-size=8B cardinality=7.30K
+|  |  |     in pipelines: 13(GETNEXT)
 |  |  |
-|  |  13:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  14:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=8,9 row-size=32B cardinality=1.44M
-|  |  |  in pipelines: 10(GETNEXT), 11(OPEN)
+|  |  |  tuple-ids=9,10 row-size=32B cardinality=1.44M
+|  |  |  in pipelines: 11(GETNEXT), 12(OPEN)
 |  |  |
-|  |  |--134:EXCHANGE [BROADCAST]
+|  |  |--136:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=9 row-size=20B cardinality=18.00K
-|  |  |  |  in pipelines: 11(GETNEXT)
+|  |  |  |  tuple-ids=10 row-size=20B cardinality=18.00K
+|  |  |  |  in pipelines: 12(GETNEXT)
 |  |  |  |
-|  |  |  F07:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F08:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Host Resources: mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=2
-|  |  |  11:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
+|  |  |  12:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |     stored statistics:
 |  |  |       table: rows=18.00K size=1.73MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |     tuple-ids=9 row-size=20B cardinality=18.00K
-|  |  |     in pipelines: 11(GETNEXT)
+|  |  |     tuple-ids=10 row-size=20B cardinality=18.00K
+|  |  |     in pipelines: 12(GETNEXT)
 |  |  |
-|  |  10:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
+|  |  11:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
 |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |     stored statistics:
 |  |       table: rows=1.44M size=96.62MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |     mem-estimate=96.00MB mem-reservation=4.00MB thread-reservation=1
-|  |     tuple-ids=8 row-size=12B cardinality=1.44M
-|  |     in pipelines: 10(GETNEXT)
+|  |     tuple-ids=9 row-size=12B cardinality=1.44M
+|  |     in pipelines: 11(GETNEXT)
+|  |
+|  135:AGGREGATE [FINALIZE]
+|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 135(GETNEXT), 05(OPEN)
+|  |
+|  134:EXCHANGE [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)]
+|  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 05(GETNEXT)
+|  |
+|  F03:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  Per-Host Resources: mem-estimate=30.31MB mem-reservation=7.38MB thread-reservation=2
+|  10:AGGREGATE [STREAMING]
+|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 05(GETNEXT)
 |  |
 |  09:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  hash predicates: ss_sold_date_sk = d1.d_date_sk
@@ -3006,8 +3006,8 @@ Per-Host Resources: mem-estimate=67.37MB mem-reservation=14.81MB thread-reservat
    tuple-ids=0 row-size=20B cardinality=2.88M
    in pipelines: 01(GETNEXT)
 ---- PARALLELPLANS
-Max Per-Host Resource Reservation: Memory=634.00MB Threads=135
-Per-Host Resource Estimates: Memory=2.36GB
+Max Per-Host Resource Reservation: Memory=624.75MB Threads=141
+Per-Host Resource Estimates: Memory=2.35GB
 F80:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Instance Resources: mem-estimate=32.03KB mem-reservation=0B thread-reservation=1
 PLAN-ROOT SINK
@@ -3315,30 +3315,30 @@ Per-Instance Resources: mem-estimate=76.80MB mem-reservation=43.88MB thread-rese
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=170 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 204(GETNEXT), 201(OPEN)
+|  |  |  in pipelines: 204(GETNEXT), 191(OPEN)
 |  |  |
 |  |  203:EXCHANGE [HASH(tpcds_parquet.item.i_item_sk)]
 |  |  |  mem-estimate=118.81KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=170 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 201(GETNEXT)
+|  |  |  in pipelines: 191(GETNEXT)
 |  |  |
-|  |  F66:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=6
+|  |  F58:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
 |  |  Per-Instance Resources: mem-estimate=20.66MB mem-reservation=3.94MB thread-reservation=1
 |  |  112:AGGREGATE [STREAMING]
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=170 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 201(GETNEXT)
+|  |  |  in pipelines: 191(GETNEXT)
 |  |  |
 |  |  109:HASH JOIN [INNER JOIN, PARTITIONED]
 |  |  |  hash-table-id=37
-|  |  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=84,71 row-size=32B cardinality=148.80K
-|  |  |  in pipelines: 201(GETNEXT), 88(OPEN)
+|  |  |  tuple-ids=75,71 row-size=32B cardinality=148.80K
+|  |  |  in pipelines: 191(GETNEXT), 88(OPEN)
 |  |  |
-|  |  |--F118:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=6
+|  |  |--F118:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
 |  |  |  |  Per-Instance Resources: mem-estimate=2.30MB mem-reservation=1.94MB thread-reservation=1
 |  |  |  JOIN BUILD
 |  |  |  |  join-table-id=37 plan-id=38 cohort-id=11
@@ -3362,72 +3362,53 @@ Per-Instance Resources: mem-estimate=76.80MB mem-reservation=43.88MB thread-rese
 |  |  |     tuple-ids=71 row-size=20B cardinality=18.00K
 |  |  |     in pipelines: 88(GETNEXT)
 |  |  |
-|  |  201:AGGREGATE [FINALIZE]
-|  |  |  group by: $a$2.brand_id, $a$2.class_id, $a$2.category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=84 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 201(GETNEXT), 89(OPEN)
-|  |  |
-|  |  200:EXCHANGE [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)]
-|  |  |  mem-estimate=677.25KB mem-reservation=0B thread-reservation=0
-|  |  |  tuple-ids=84 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 89(GETNEXT)
-|  |  |
-|  |  F55:PLAN FRAGMENT [RANDOM] hosts=3 instances=6
-|  |  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.50MB thread-reservation=1
-|  |  108:AGGREGATE [STREAMING]
-|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=84 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 89(GETNEXT)
-|  |  |
-|  |  107:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  108:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  |  hash-table-id=38
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
-|  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=72,73,74 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 89(GETNEXT), 198(OPEN)
+|  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 191(GETNEXT), 200(OPEN)
 |  |  |
-|  |  |--F119:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  |  |  Per-Instance Resources: mem-estimate=7.48MB mem-reservation=5.75MB thread-reservation=1
+|  |  |--F119:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
+|  |  |  |  Per-Instance Resources: mem-estimate=2.82MB mem-reservation=1.94MB thread-reservation=1
 |  |  |  JOIN BUILD
 |  |  |  |  join-table-id=38 plan-id=39 cohort-id=11
 |  |  |  |  build expressions: iws.i_brand_id, iws.i_category_id, iws.i_class_id
-|  |  |  |  mem-estimate=5.75MB mem-reservation=5.75MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  199:EXCHANGE [BROADCAST]
-|  |  |  |  mem-estimate=1.73MB mem-reservation=0B thread-reservation=0
+|  |  |  201:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=169 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 198(GETNEXT)
+|  |  |  |  in pipelines: 200(GETNEXT)
 |  |  |  |
-|  |  |  F65:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
+|  |  |  F66:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
 |  |  |  Per-Instance Resources: mem-estimate=10.88MB mem-reservation=1.94MB thread-reservation=1
-|  |  |  198:AGGREGATE [FINALIZE]
+|  |  |  200:AGGREGATE [FINALIZE]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  tuple-ids=169 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 198(GETNEXT), 99(OPEN)
+|  |  |  |  in pipelines: 200(GETNEXT), 100(OPEN)
 |  |  |  |
-|  |  |  197:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  199:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
 |  |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=169 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 99(GETNEXT)
+|  |  |  |  in pipelines: 100(GETNEXT)
 |  |  |  |
-|  |  |  F62:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
+|  |  |  F63:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  Per-Instance Resources: mem-estimate=42.00MB mem-reservation=7.00MB thread-reservation=1
-|  |  |  106:AGGREGATE [STREAMING]
+|  |  |  107:AGGREGATE [STREAMING]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=169 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 99(GETNEXT)
+|  |  |  |  in pipelines: 100(GETNEXT)
 |  |  |  |
-|  |  |  103:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  104:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash-table-id=39
 |  |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=80,81,82 row-size=40B cardinality=719.38K
-|  |  |  |  in pipelines: 99(GETNEXT), 101(OPEN)
+|  |  |  |  tuple-ids=81,82,83 row-size=40B cardinality=719.38K
+|  |  |  |  in pipelines: 100(GETNEXT), 102(OPEN)
 |  |  |  |
 |  |  |  |--F120:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  |  |  Per-Instance Resources: mem-estimate=3.94MB mem-reservation=3.88MB thread-reservation=1
@@ -3436,14 +3417,14 @@ Per-Instance Resources: mem-estimate=76.80MB mem-reservation=43.88MB thread-rese
 |  |  |  |  |  build expressions: d3.d_date_sk
 |  |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  |
-|  |  |  |  196:EXCHANGE [BROADCAST]
+|  |  |  |  198:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=82 row-size=8B cardinality=7.30K
-|  |  |  |  |  in pipelines: 101(GETNEXT)
+|  |  |  |  |  tuple-ids=83 row-size=8B cardinality=7.30K
+|  |  |  |  |  in pipelines: 102(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F64:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F65:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |  101:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
+|  |  |  |  102:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -3453,16 +3434,16 @@ Per-Instance Resources: mem-estimate=76.80MB mem-reservation=43.88MB thread-rese
 |  |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=0
-|  |  |  |     tuple-ids=82 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 101(GETNEXT)
+|  |  |  |     tuple-ids=83 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 102(GETNEXT)
 |  |  |  |
-|  |  |  102:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  103:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash-table-id=40
 |  |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=80,81 row-size=32B cardinality=719.38K
-|  |  |  |  in pipelines: 99(GETNEXT), 100(OPEN)
+|  |  |  |  tuple-ids=81,82 row-size=32B cardinality=719.38K
+|  |  |  |  in pipelines: 100(GETNEXT), 101(OPEN)
 |  |  |  |
 |  |  |  |--F121:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  |  |  Per-Instance Resources: mem-estimate=4.24MB mem-reservation=3.88MB thread-reservation=1
@@ -3471,80 +3452,80 @@ Per-Instance Resources: mem-estimate=76.80MB mem-reservation=43.88MB thread-rese
 |  |  |  |  |  build expressions: iws.i_item_sk
 |  |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  |
-|  |  |  |  195:EXCHANGE [BROADCAST]
+|  |  |  |  197:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=81 row-size=20B cardinality=18.00K
-|  |  |  |  |  in pipelines: 100(GETNEXT)
+|  |  |  |  |  tuple-ids=82 row-size=20B cardinality=18.00K
+|  |  |  |  |  in pipelines: 101(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F63:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F64:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |  100:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
+|  |  |  |  101:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=0
-|  |  |  |     tuple-ids=81 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 100(GETNEXT)
+|  |  |  |     tuple-ids=82 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 101(GETNEXT)
 |  |  |  |
-|  |  |  99:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
+|  |  |  100:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
 |  |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |  |     stored statistics:
 |  |  |       table: rows=719.38K size=45.09MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |  |     mem-estimate=32.00MB mem-reservation=4.00MB thread-reservation=0
-|  |  |     tuple-ids=80 row-size=12B cardinality=719.38K
-|  |  |     in pipelines: 99(GETNEXT)
+|  |  |     tuple-ids=81 row-size=12B cardinality=719.38K
+|  |  |     in pipelines: 100(GETNEXT)
 |  |  |
-|  |  105:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  106:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  |  hash-table-id=41
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
-|  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=72,73,74 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 89(GETNEXT), 193(OPEN)
+|  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 191(GETNEXT), 195(OPEN)
 |  |  |
-|  |  |--F122:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  |  |  Per-Instance Resources: mem-estimate=7.50MB mem-reservation=5.75MB thread-reservation=1
+|  |  |--F122:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
+|  |  |  |  Per-Instance Resources: mem-estimate=2.55MB mem-reservation=1.94MB thread-reservation=1
 |  |  |  JOIN BUILD
 |  |  |  |  join-table-id=41 plan-id=42 cohort-id=11
 |  |  |  |  build expressions: ics.i_brand_id, ics.i_category_id, ics.i_class_id
-|  |  |  |  mem-estimate=5.75MB mem-reservation=5.75MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  194:EXCHANGE [BROADCAST]
-|  |  |  |  mem-estimate=1.75MB mem-reservation=0B thread-reservation=0
+|  |  |  196:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=168 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 193(GETNEXT)
+|  |  |  |  in pipelines: 195(GETNEXT)
 |  |  |  |
-|  |  |  F61:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
+|  |  |  F62:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
 |  |  |  Per-Instance Resources: mem-estimate=10.61MB mem-reservation=1.94MB thread-reservation=1
-|  |  |  193:AGGREGATE [FINALIZE]
+|  |  |  195:AGGREGATE [FINALIZE]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  tuple-ids=168 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 193(GETNEXT), 94(OPEN)
+|  |  |  |  in pipelines: 195(GETNEXT), 95(OPEN)
 |  |  |  |
-|  |  |  192:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  194:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
 |  |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=168 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 94(GETNEXT)
+|  |  |  |  in pipelines: 95(GETNEXT)
 |  |  |  |
-|  |  |  F58:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  |  F59:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  Per-Instance Resources: mem-estimate=58.00MB mem-reservation=7.00MB thread-reservation=1
-|  |  |  104:AGGREGATE [STREAMING]
+|  |  |  105:AGGREGATE [STREAMING]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=168 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 94(GETNEXT)
+|  |  |  |  in pipelines: 95(GETNEXT)
 |  |  |  |
-|  |  |  98:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  99:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash-table-id=42
 |  |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=76,77,78 row-size=40B cardinality=1.44M
-|  |  |  |  in pipelines: 94(GETNEXT), 96(OPEN)
+|  |  |  |  tuple-ids=77,78,79 row-size=40B cardinality=1.44M
+|  |  |  |  in pipelines: 95(GETNEXT), 97(OPEN)
 |  |  |  |
 |  |  |  |--F123:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  |  |  Per-Instance Resources: mem-estimate=3.94MB mem-reservation=3.88MB thread-reservation=1
@@ -3553,14 +3534,14 @@ Per-Instance Resources: mem-estimate=76.80MB mem-reservation=43.88MB thread-rese
 |  |  |  |  |  build expressions: d2.d_date_sk
 |  |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  |
-|  |  |  |  191:EXCHANGE [BROADCAST]
+|  |  |  |  193:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=78 row-size=8B cardinality=7.30K
-|  |  |  |  |  in pipelines: 96(GETNEXT)
+|  |  |  |  |  tuple-ids=79 row-size=8B cardinality=7.30K
+|  |  |  |  |  in pipelines: 97(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F60:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F61:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |  96:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
+|  |  |  |  97:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -3570,16 +3551,16 @@ Per-Instance Resources: mem-estimate=76.80MB mem-reservation=43.88MB thread-rese
 |  |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=0
-|  |  |  |     tuple-ids=78 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 96(GETNEXT)
+|  |  |  |     tuple-ids=79 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 97(GETNEXT)
 |  |  |  |
-|  |  |  97:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  98:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash-table-id=43
 |  |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=76,77 row-size=32B cardinality=1.44M
-|  |  |  |  in pipelines: 94(GETNEXT), 95(OPEN)
+|  |  |  |  tuple-ids=77,78 row-size=32B cardinality=1.44M
+|  |  |  |  in pipelines: 95(GETNEXT), 96(OPEN)
 |  |  |  |
 |  |  |  |--F124:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  |  |  Per-Instance Resources: mem-estimate=4.24MB mem-reservation=3.88MB thread-reservation=1
@@ -3588,32 +3569,51 @@ Per-Instance Resources: mem-estimate=76.80MB mem-reservation=43.88MB thread-rese
 |  |  |  |  |  build expressions: ics.i_item_sk
 |  |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  |
-|  |  |  |  190:EXCHANGE [BROADCAST]
+|  |  |  |  192:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=77 row-size=20B cardinality=18.00K
-|  |  |  |  |  in pipelines: 95(GETNEXT)
+|  |  |  |  |  tuple-ids=78 row-size=20B cardinality=18.00K
+|  |  |  |  |  in pipelines: 96(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F59:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F60:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |  95:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
+|  |  |  |  96:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=0
-|  |  |  |     tuple-ids=77 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 95(GETNEXT)
+|  |  |  |     tuple-ids=78 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 96(GETNEXT)
 |  |  |  |
-|  |  |  94:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
+|  |  |  95:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
 |  |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |  |     stored statistics:
 |  |  |       table: rows=1.44M size=96.62MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |  |     mem-estimate=48.00MB mem-reservation=4.00MB thread-reservation=0
-|  |  |     tuple-ids=76 row-size=12B cardinality=1.44M
-|  |  |     in pipelines: 94(GETNEXT)
+|  |  |     tuple-ids=77 row-size=12B cardinality=1.44M
+|  |  |     in pipelines: 95(GETNEXT)
+|  |  |
+|  |  191:AGGREGATE [FINALIZE]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 191(GETNEXT), 89(OPEN)
+|  |  |
+|  |  190:EXCHANGE [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)]
+|  |  |  mem-estimate=677.25KB mem-reservation=0B thread-reservation=0
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 89(GETNEXT)
+|  |  |
+|  |  F55:PLAN FRAGMENT [RANDOM] hosts=3 instances=6
+|  |  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.50MB thread-reservation=1
+|  |  94:AGGREGATE [STREAMING]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  tuple-ids=75 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 89(GETNEXT)
 |  |  |
 |  |  93:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash-table-id=44
@@ -3999,30 +3999,30 @@ Per-Instance Resources: mem-estimate=76.80MB mem-reservation=43.88MB thread-rese
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=148 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 176(GETNEXT), 173(OPEN)
+|  |  |  in pipelines: 176(GETNEXT), 163(OPEN)
 |  |  |
 |  |  175:EXCHANGE [HASH(tpcds_parquet.item.i_item_sk)]
 |  |  |  mem-estimate=118.81KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=148 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 173(GETNEXT)
+|  |  |  in pipelines: 163(GETNEXT)
 |  |  |
-|  |  F40:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=6
+|  |  F32:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
 |  |  Per-Instance Resources: mem-estimate=20.66MB mem-reservation=3.94MB thread-reservation=1
 |  |  70:AGGREGATE [STREAMING]
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=148 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 173(GETNEXT)
+|  |  |  in pipelines: 163(GETNEXT)
 |  |  |
 |  |  67:HASH JOIN [INNER JOIN, PARTITIONED]
 |  |  |  hash-table-id=25
-|  |  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=50,37 row-size=32B cardinality=148.80K
-|  |  |  in pipelines: 173(GETNEXT), 46(OPEN)
+|  |  |  tuple-ids=41,37 row-size=32B cardinality=148.80K
+|  |  |  in pipelines: 163(GETNEXT), 46(OPEN)
 |  |  |
-|  |  |--F106:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=6
+|  |  |--F106:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
 |  |  |  |  Per-Instance Resources: mem-estimate=2.30MB mem-reservation=1.94MB thread-reservation=1
 |  |  |  JOIN BUILD
 |  |  |  |  join-table-id=25 plan-id=26 cohort-id=08
@@ -4046,72 +4046,53 @@ Per-Instance Resources: mem-estimate=76.80MB mem-reservation=43.88MB thread-rese
 |  |  |     tuple-ids=37 row-size=20B cardinality=18.00K
 |  |  |     in pipelines: 46(GETNEXT)
 |  |  |
-|  |  173:AGGREGATE [FINALIZE]
-|  |  |  group by: $a$2.brand_id, $a$2.class_id, $a$2.category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=50 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 173(GETNEXT), 47(OPEN)
-|  |  |
-|  |  172:EXCHANGE [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)]
-|  |  |  mem-estimate=677.25KB mem-reservation=0B thread-reservation=0
-|  |  |  tuple-ids=50 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 47(GETNEXT)
-|  |  |
-|  |  F29:PLAN FRAGMENT [RANDOM] hosts=3 instances=6
-|  |  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.50MB thread-reservation=1
-|  |  66:AGGREGATE [STREAMING]
-|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=50 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 47(GETNEXT)
-|  |  |
-|  |  65:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  66:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  |  hash-table-id=26
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
-|  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=38,39,40 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 47(GETNEXT), 170(OPEN)
+|  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 163(GETNEXT), 172(OPEN)
 |  |  |
-|  |  |--F107:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  |  |  Per-Instance Resources: mem-estimate=7.48MB mem-reservation=5.75MB thread-reservation=1
+|  |  |--F107:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
+|  |  |  |  Per-Instance Resources: mem-estimate=2.82MB mem-reservation=1.94MB thread-reservation=1
 |  |  |  JOIN BUILD
 |  |  |  |  join-table-id=26 plan-id=27 cohort-id=08
 |  |  |  |  build expressions: iws.i_brand_id, iws.i_category_id, iws.i_class_id
-|  |  |  |  mem-estimate=5.75MB mem-reservation=5.75MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  171:EXCHANGE [BROADCAST]
-|  |  |  |  mem-estimate=1.73MB mem-reservation=0B thread-reservation=0
+|  |  |  173:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=147 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 170(GETNEXT)
+|  |  |  |  in pipelines: 172(GETNEXT)
 |  |  |  |
-|  |  |  F39:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
+|  |  |  F40:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
 |  |  |  Per-Instance Resources: mem-estimate=10.88MB mem-reservation=1.94MB thread-reservation=1
-|  |  |  170:AGGREGATE [FINALIZE]
+|  |  |  172:AGGREGATE [FINALIZE]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  tuple-ids=147 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 170(GETNEXT), 57(OPEN)
+|  |  |  |  in pipelines: 172(GETNEXT), 58(OPEN)
 |  |  |  |
-|  |  |  169:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  171:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
 |  |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=147 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 57(GETNEXT)
+|  |  |  |  in pipelines: 58(GETNEXT)
 |  |  |  |
-|  |  |  F36:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
+|  |  |  F37:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  Per-Instance Resources: mem-estimate=42.00MB mem-reservation=7.00MB thread-reservation=1
-|  |  |  64:AGGREGATE [STREAMING]
+|  |  |  65:AGGREGATE [STREAMING]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=147 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 57(GETNEXT)
+|  |  |  |  in pipelines: 58(GETNEXT)
 |  |  |  |
-|  |  |  61:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  62:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash-table-id=27
 |  |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=46,47,48 row-size=40B cardinality=719.38K
-|  |  |  |  in pipelines: 57(GETNEXT), 59(OPEN)
+|  |  |  |  tuple-ids=47,48,49 row-size=40B cardinality=719.38K
+|  |  |  |  in pipelines: 58(GETNEXT), 60(OPEN)
 |  |  |  |
 |  |  |  |--F108:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  |  |  Per-Instance Resources: mem-estimate=3.94MB mem-reservation=3.88MB thread-reservation=1
@@ -4120,14 +4101,14 @@ Per-Instance Resources: mem-estimate=76.80MB mem-reservation=43.88MB thread-rese
 |  |  |  |  |  build expressions: d3.d_date_sk
 |  |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  |
-|  |  |  |  168:EXCHANGE [BROADCAST]
+|  |  |  |  170:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=48 row-size=8B cardinality=7.30K
-|  |  |  |  |  in pipelines: 59(GETNEXT)
+|  |  |  |  |  tuple-ids=49 row-size=8B cardinality=7.30K
+|  |  |  |  |  in pipelines: 60(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F38:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F39:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |  59:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
+|  |  |  |  60:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -4137,16 +4118,16 @@ Per-Instance Resources: mem-estimate=76.80MB mem-reservation=43.88MB thread-rese
 |  |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=0
-|  |  |  |     tuple-ids=48 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 59(GETNEXT)
+|  |  |  |     tuple-ids=49 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 60(GETNEXT)
 |  |  |  |
-|  |  |  60:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  61:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash-table-id=28
 |  |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=46,47 row-size=32B cardinality=719.38K
-|  |  |  |  in pipelines: 57(GETNEXT), 58(OPEN)
+|  |  |  |  tuple-ids=47,48 row-size=32B cardinality=719.38K
+|  |  |  |  in pipelines: 58(GETNEXT), 59(OPEN)
 |  |  |  |
 |  |  |  |--F109:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  |  |  Per-Instance Resources: mem-estimate=4.24MB mem-reservation=3.88MB thread-reservation=1
@@ -4155,80 +4136,80 @@ Per-Instance Resources: mem-estimate=76.80MB mem-reservation=43.88MB thread-rese
 |  |  |  |  |  build expressions: iws.i_item_sk
 |  |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  |
-|  |  |  |  167:EXCHANGE [BROADCAST]
+|  |  |  |  169:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=47 row-size=20B cardinality=18.00K
-|  |  |  |  |  in pipelines: 58(GETNEXT)
+|  |  |  |  |  tuple-ids=48 row-size=20B cardinality=18.00K
+|  |  |  |  |  in pipelines: 59(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F37:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F38:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |  58:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
+|  |  |  |  59:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=0
-|  |  |  |     tuple-ids=47 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 58(GETNEXT)
+|  |  |  |     tuple-ids=48 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 59(GETNEXT)
 |  |  |  |
-|  |  |  57:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
+|  |  |  58:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
 |  |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |  |     stored statistics:
 |  |  |       table: rows=719.38K size=45.09MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |  |     mem-estimate=32.00MB mem-reservation=4.00MB thread-reservation=0
-|  |  |     tuple-ids=46 row-size=12B cardinality=719.38K
-|  |  |     in pipelines: 57(GETNEXT)
+|  |  |     tuple-ids=47 row-size=12B cardinality=719.38K
+|  |  |     in pipelines: 58(GETNEXT)
 |  |  |
-|  |  63:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  64:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  |  hash-table-id=29
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
-|  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=38,39,40 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 47(GETNEXT), 165(OPEN)
+|  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 163(GETNEXT), 167(OPEN)
 |  |  |
-|  |  |--F110:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  |  |  Per-Instance Resources: mem-estimate=7.50MB mem-reservation=5.75MB thread-reservation=1
+|  |  |--F110:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
+|  |  |  |  Per-Instance Resources: mem-estimate=2.55MB mem-reservation=1.94MB thread-reservation=1
 |  |  |  JOIN BUILD
 |  |  |  |  join-table-id=29 plan-id=30 cohort-id=08
 |  |  |  |  build expressions: ics.i_brand_id, ics.i_category_id, ics.i_class_id
-|  |  |  |  mem-estimate=5.75MB mem-reservation=5.75MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  166:EXCHANGE [BROADCAST]
-|  |  |  |  mem-estimate=1.75MB mem-reservation=0B thread-reservation=0
+|  |  |  168:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=146 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 165(GETNEXT)
+|  |  |  |  in pipelines: 167(GETNEXT)
 |  |  |  |
-|  |  |  F35:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
+|  |  |  F36:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
 |  |  |  Per-Instance Resources: mem-estimate=10.61MB mem-reservation=1.94MB thread-reservation=1
-|  |  |  165:AGGREGATE [FINALIZE]
+|  |  |  167:AGGREGATE [FINALIZE]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  tuple-ids=146 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 165(GETNEXT), 52(OPEN)
+|  |  |  |  in pipelines: 167(GETNEXT), 53(OPEN)
 |  |  |  |
-|  |  |  164:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  166:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
 |  |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=146 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 52(GETNEXT)
+|  |  |  |  in pipelines: 53(GETNEXT)
 |  |  |  |
-|  |  |  F32:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  |  F33:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  Per-Instance Resources: mem-estimate=58.00MB mem-reservation=7.00MB thread-reservation=1
-|  |  |  62:AGGREGATE [STREAMING]
+|  |  |  63:AGGREGATE [STREAMING]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=146 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 52(GETNEXT)
+|  |  |  |  in pipelines: 53(GETNEXT)
 |  |  |  |
-|  |  |  56:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  57:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash-table-id=30
 |  |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=42,43,44 row-size=40B cardinality=1.44M
-|  |  |  |  in pipelines: 52(GETNEXT), 54(OPEN)
+|  |  |  |  tuple-ids=43,44,45 row-size=40B cardinality=1.44M
+|  |  |  |  in pipelines: 53(GETNEXT), 55(OPEN)
 |  |  |  |
 |  |  |  |--F111:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  |  |  Per-Instance Resources: mem-estimate=3.94MB mem-reservation=3.88MB thread-reservation=1
@@ -4237,14 +4218,14 @@ Per-Instance Resources: mem-estimate=76.80MB mem-reservation=43.88MB thread-rese
 |  |  |  |  |  build expressions: d2.d_date_sk
 |  |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  |
-|  |  |  |  163:EXCHANGE [BROADCAST]
+|  |  |  |  165:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=44 row-size=8B cardinality=7.30K
-|  |  |  |  |  in pipelines: 54(GETNEXT)
+|  |  |  |  |  tuple-ids=45 row-size=8B cardinality=7.30K
+|  |  |  |  |  in pipelines: 55(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F34:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F35:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |  54:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
+|  |  |  |  55:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -4254,16 +4235,16 @@ Per-Instance Resources: mem-estimate=76.80MB mem-reservation=43.88MB thread-rese
 |  |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=0
-|  |  |  |     tuple-ids=44 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 54(GETNEXT)
+|  |  |  |     tuple-ids=45 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 55(GETNEXT)
 |  |  |  |
-|  |  |  55:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  56:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash-table-id=31
 |  |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=42,43 row-size=32B cardinality=1.44M
-|  |  |  |  in pipelines: 52(GETNEXT), 53(OPEN)
+|  |  |  |  tuple-ids=43,44 row-size=32B cardinality=1.44M
+|  |  |  |  in pipelines: 53(GETNEXT), 54(OPEN)
 |  |  |  |
 |  |  |  |--F112:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  |  |  Per-Instance Resources: mem-estimate=4.24MB mem-reservation=3.88MB thread-reservation=1
@@ -4272,32 +4253,51 @@ Per-Instance Resources: mem-estimate=76.80MB mem-reservation=43.88MB thread-rese
 |  |  |  |  |  build expressions: ics.i_item_sk
 |  |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  |
-|  |  |  |  162:EXCHANGE [BROADCAST]
+|  |  |  |  164:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=43 row-size=20B cardinality=18.00K
-|  |  |  |  |  in pipelines: 53(GETNEXT)
+|  |  |  |  |  tuple-ids=44 row-size=20B cardinality=18.00K
+|  |  |  |  |  in pipelines: 54(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F33:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F34:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |  53:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
+|  |  |  |  54:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=0
-|  |  |  |     tuple-ids=43 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 53(GETNEXT)
+|  |  |  |     tuple-ids=44 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 54(GETNEXT)
 |  |  |  |
-|  |  |  52:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
+|  |  |  53:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
 |  |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |  |     stored statistics:
 |  |  |       table: rows=1.44M size=96.62MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |  |     mem-estimate=48.00MB mem-reservation=4.00MB thread-reservation=0
-|  |  |     tuple-ids=42 row-size=12B cardinality=1.44M
-|  |  |     in pipelines: 52(GETNEXT)
+|  |  |     tuple-ids=43 row-size=12B cardinality=1.44M
+|  |  |     in pipelines: 53(GETNEXT)
+|  |  |
+|  |  163:AGGREGATE [FINALIZE]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 163(GETNEXT), 47(OPEN)
+|  |  |
+|  |  162:EXCHANGE [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)]
+|  |  |  mem-estimate=677.25KB mem-reservation=0B thread-reservation=0
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 47(GETNEXT)
+|  |  |
+|  |  F29:PLAN FRAGMENT [RANDOM] hosts=3 instances=6
+|  |  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.50MB thread-reservation=1
+|  |  52:AGGREGATE [STREAMING]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  tuple-ids=41 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 47(GETNEXT)
 |  |  |
 |  |  51:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash-table-id=32
@@ -4684,30 +4684,30 @@ Per-Instance Resources: mem-estimate=26.00MB mem-reservation=4.00MB thread-reser
 |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  tuple-ids=126 row-size=8B cardinality=17.98K
-|  |  in pipelines: 148(GETNEXT), 145(OPEN)
+|  |  in pipelines: 148(GETNEXT), 135(OPEN)
 |  |
 |  147:EXCHANGE [HASH(tpcds_parquet.item.i_item_sk)]
 |  |  mem-estimate=118.81KB mem-reservation=0B thread-reservation=0
 |  |  tuple-ids=126 row-size=8B cardinality=17.98K
-|  |  in pipelines: 145(GETNEXT)
+|  |  in pipelines: 135(GETNEXT)
 |  |
-|  F14:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=6
+|  F06:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
 |  Per-Instance Resources: mem-estimate=20.66MB mem-reservation=3.94MB thread-reservation=1
 |  28:AGGREGATE [STREAMING]
 |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
 |  |  tuple-ids=126 row-size=8B cardinality=17.98K
-|  |  in pipelines: 145(GETNEXT)
+|  |  in pipelines: 135(GETNEXT)
 |  |
 |  25:HASH JOIN [INNER JOIN, PARTITIONED]
 |  |  hash-table-id=13
-|  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=16,3 row-size=32B cardinality=148.80K
-|  |  in pipelines: 145(GETNEXT), 04(OPEN)
+|  |  tuple-ids=7,3 row-size=32B cardinality=148.80K
+|  |  in pipelines: 135(GETNEXT), 04(OPEN)
 |  |
-|  |--F94:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=6
+|  |--F94:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
 |  |  |  Per-Instance Resources: mem-estimate=5.30MB mem-reservation=4.94MB thread-reservation=1 runtime-filters-memory=3.00MB
 |  |  JOIN BUILD
 |  |  |  join-table-id=13 plan-id=14 cohort-id=05
@@ -4732,73 +4732,54 @@ Per-Instance Resources: mem-estimate=26.00MB mem-reservation=4.00MB thread-reser
 |  |     tuple-ids=3 row-size=20B cardinality=18.00K
 |  |     in pipelines: 04(GETNEXT)
 |  |
-|  145:AGGREGATE [FINALIZE]
-|  |  group by: $a$2.brand_id, $a$2.class_id, $a$2.category_id
-|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 145(GETNEXT), 05(OPEN)
-|  |
-|  144:EXCHANGE [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)]
-|  |  mem-estimate=677.25KB mem-reservation=0B thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 05(GETNEXT)
-|  |
-|  F03:PLAN FRAGMENT [RANDOM] hosts=3 instances=6
-|  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.50MB thread-reservation=1
-|  24:AGGREGATE [STREAMING]
-|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 05(GETNEXT)
-|  |
-|  23:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  24:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  hash-table-id=14
 |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
-|  |  mem-estimate=0B mem-reservation=0B spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=4,5,6 row-size=40B cardinality=2.88M
-|  |  in pipelines: 05(GETNEXT), 142(OPEN)
+|  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 135(GETNEXT), 144(OPEN)
 |  |
-|  |--F95:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  |  Per-Instance Resources: mem-estimate=9.48MB mem-reservation=7.75MB thread-reservation=1 runtime-filters-memory=2.00MB
+|  |--F95:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
+|  |  |  Per-Instance Resources: mem-estimate=4.82MB mem-reservation=3.94MB thread-reservation=1 runtime-filters-memory=2.00MB
 |  |  JOIN BUILD
 |  |  |  join-table-id=14 plan-id=15 cohort-id=05
 |  |  |  build expressions: iws.i_brand_id, iws.i_category_id, iws.i_class_id
 |  |  |  runtime filters: RF012[bloom] <- iws.i_brand_id, RF013[bloom] <- iws.i_category_id
-|  |  |  mem-estimate=5.75MB mem-reservation=5.75MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |
-|  |  143:EXCHANGE [BROADCAST]
-|  |  |  mem-estimate=1.73MB mem-reservation=0B thread-reservation=0
+|  |  145:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=125 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 142(GETNEXT)
+|  |  |  in pipelines: 144(GETNEXT)
 |  |  |
-|  |  F13:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
+|  |  F14:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
 |  |  Per-Instance Resources: mem-estimate=10.88MB mem-reservation=1.94MB thread-reservation=1
-|  |  142:AGGREGATE [FINALIZE]
+|  |  144:AGGREGATE [FINALIZE]
 |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=125 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 142(GETNEXT), 15(OPEN)
+|  |  |  in pipelines: 144(GETNEXT), 16(OPEN)
 |  |  |
-|  |  141:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  143:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
 |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=125 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 15(GETNEXT)
+|  |  |  in pipelines: 16(GETNEXT)
 |  |  |
-|  |  F10:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
+|  |  F11:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  Per-Instance Resources: mem-estimate=42.00MB mem-reservation=7.00MB thread-reservation=1
-|  |  22:AGGREGATE [STREAMING]
+|  |  23:AGGREGATE [STREAMING]
 |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  tuple-ids=125 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 15(GETNEXT)
+|  |  |  in pipelines: 16(GETNEXT)
 |  |  |
-|  |  19:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  20:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash-table-id=15
 |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=12,13,14 row-size=40B cardinality=719.38K
-|  |  |  in pipelines: 15(GETNEXT), 17(OPEN)
+|  |  |  tuple-ids=13,14,15 row-size=40B cardinality=719.38K
+|  |  |  in pipelines: 16(GETNEXT), 18(OPEN)
 |  |  |
 |  |  |--F96:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  |  Per-Instance Resources: mem-estimate=3.94MB mem-reservation=3.88MB thread-reservation=1
@@ -4807,14 +4788,14 @@ Per-Instance Resources: mem-estimate=26.00MB mem-reservation=4.00MB thread-reser
 |  |  |  |  build expressions: d3.d_date_sk
 |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  140:EXCHANGE [BROADCAST]
+|  |  |  142:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=14 row-size=8B cardinality=7.30K
-|  |  |  |  in pipelines: 17(GETNEXT)
+|  |  |  |  tuple-ids=15 row-size=8B cardinality=7.30K
+|  |  |  |  in pipelines: 18(GETNEXT)
 |  |  |  |
-|  |  |  F12:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F13:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  17:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
+|  |  |  18:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     stored statistics:
@@ -4824,16 +4805,16 @@ Per-Instance Resources: mem-estimate=26.00MB mem-reservation=4.00MB thread-reser
 |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=0
-|  |  |     tuple-ids=14 row-size=8B cardinality=7.30K
-|  |  |     in pipelines: 17(GETNEXT)
+|  |  |     tuple-ids=15 row-size=8B cardinality=7.30K
+|  |  |     in pipelines: 18(GETNEXT)
 |  |  |
-|  |  18:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  19:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash-table-id=16
 |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=12,13 row-size=32B cardinality=719.38K
-|  |  |  in pipelines: 15(GETNEXT), 16(OPEN)
+|  |  |  tuple-ids=13,14 row-size=32B cardinality=719.38K
+|  |  |  in pipelines: 16(GETNEXT), 17(OPEN)
 |  |  |
 |  |  |--F97:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  |  Per-Instance Resources: mem-estimate=4.24MB mem-reservation=3.88MB thread-reservation=1
@@ -4842,80 +4823,80 @@ Per-Instance Resources: mem-estimate=26.00MB mem-reservation=4.00MB thread-reser
 |  |  |  |  build expressions: iws.i_item_sk
 |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  139:EXCHANGE [BROADCAST]
+|  |  |  141:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=13 row-size=20B cardinality=18.00K
-|  |  |  |  in pipelines: 16(GETNEXT)
+|  |  |  |  tuple-ids=14 row-size=20B cardinality=18.00K
+|  |  |  |  in pipelines: 17(GETNEXT)
 |  |  |  |
-|  |  |  F11:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F12:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  16:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
+|  |  |  17:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |     stored statistics:
 |  |  |       table: rows=18.00K size=1.73MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |     mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=0
-|  |  |     tuple-ids=13 row-size=20B cardinality=18.00K
-|  |  |     in pipelines: 16(GETNEXT)
+|  |  |     tuple-ids=14 row-size=20B cardinality=18.00K
+|  |  |     in pipelines: 17(GETNEXT)
 |  |  |
-|  |  15:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
+|  |  16:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
 |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |     stored statistics:
 |  |       table: rows=719.38K size=45.09MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |     mem-estimate=32.00MB mem-reservation=4.00MB thread-reservation=0
-|  |     tuple-ids=12 row-size=12B cardinality=719.38K
-|  |     in pipelines: 15(GETNEXT)
+|  |     tuple-ids=13 row-size=12B cardinality=719.38K
+|  |     in pipelines: 16(GETNEXT)
 |  |
-|  21:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  22:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  hash-table-id=17
 |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
-|  |  mem-estimate=0B mem-reservation=0B spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=4,5,6 row-size=40B cardinality=2.88M
-|  |  in pipelines: 05(GETNEXT), 137(OPEN)
+|  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 135(GETNEXT), 139(OPEN)
 |  |
-|  |--F98:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  |  Per-Instance Resources: mem-estimate=7.50MB mem-reservation=5.75MB thread-reservation=1
+|  |--F98:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
+|  |  |  Per-Instance Resources: mem-estimate=2.55MB mem-reservation=1.94MB thread-reservation=1
 |  |  JOIN BUILD
 |  |  |  join-table-id=17 plan-id=18 cohort-id=05
 |  |  |  build expressions: ics.i_brand_id, ics.i_category_id, ics.i_class_id
-|  |  |  mem-estimate=5.75MB mem-reservation=5.75MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |
-|  |  138:EXCHANGE [BROADCAST]
-|  |  |  mem-estimate=1.75MB mem-reservation=0B thread-reservation=0
+|  |  140:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=124 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 137(GETNEXT)
+|  |  |  in pipelines: 139(GETNEXT)
 |  |  |
-|  |  F09:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
+|  |  F10:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
 |  |  Per-Instance Resources: mem-estimate=10.61MB mem-reservation=1.94MB thread-reservation=1
-|  |  137:AGGREGATE [FINALIZE]
+|  |  139:AGGREGATE [FINALIZE]
 |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=124 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 137(GETNEXT), 10(OPEN)
+|  |  |  in pipelines: 139(GETNEXT), 11(OPEN)
 |  |  |
-|  |  136:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  138:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
 |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=124 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 10(GETNEXT)
+|  |  |  in pipelines: 11(GETNEXT)
 |  |  |
-|  |  F06:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  F07:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  Per-Instance Resources: mem-estimate=58.00MB mem-reservation=7.00MB thread-reservation=1
-|  |  20:AGGREGATE [STREAMING]
+|  |  21:AGGREGATE [STREAMING]
 |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  tuple-ids=124 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 10(GETNEXT)
+|  |  |  in pipelines: 11(GETNEXT)
 |  |  |
-|  |  14:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  15:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash-table-id=18
 |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=8,9,10 row-size=40B cardinality=1.44M
-|  |  |  in pipelines: 10(GETNEXT), 12(OPEN)
+|  |  |  tuple-ids=9,10,11 row-size=40B cardinality=1.44M
+|  |  |  in pipelines: 11(GETNEXT), 13(OPEN)
 |  |  |
 |  |  |--F99:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  |  Per-Instance Resources: mem-estimate=3.94MB mem-reservation=3.88MB thread-reservation=1
@@ -4924,14 +4905,14 @@ Per-Instance Resources: mem-estimate=26.00MB mem-reservation=4.00MB thread-reser
 |  |  |  |  build expressions: d2.d_date_sk
 |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  135:EXCHANGE [BROADCAST]
+|  |  |  137:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=10 row-size=8B cardinality=7.30K
-|  |  |  |  in pipelines: 12(GETNEXT)
+|  |  |  |  tuple-ids=11 row-size=8B cardinality=7.30K
+|  |  |  |  in pipelines: 13(GETNEXT)
 |  |  |  |
-|  |  |  F08:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F09:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  12:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
+|  |  |  13:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     stored statistics:
@@ -4941,16 +4922,16 @@ Per-Instance Resources: mem-estimate=26.00MB mem-reservation=4.00MB thread-reser
 |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=0
-|  |  |     tuple-ids=10 row-size=8B cardinality=7.30K
-|  |  |     in pipelines: 12(GETNEXT)
+|  |  |     tuple-ids=11 row-size=8B cardinality=7.30K
+|  |  |     in pipelines: 13(GETNEXT)
 |  |  |
-|  |  13:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  14:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash-table-id=19
 |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=8,9 row-size=32B cardinality=1.44M
-|  |  |  in pipelines: 10(GETNEXT), 11(OPEN)
+|  |  |  tuple-ids=9,10 row-size=32B cardinality=1.44M
+|  |  |  in pipelines: 11(GETNEXT), 12(OPEN)
 |  |  |
 |  |  |--F100:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  |  Per-Instance Resources: mem-estimate=4.24MB mem-reservation=3.88MB thread-reservation=1
@@ -4959,32 +4940,51 @@ Per-Instance Resources: mem-estimate=26.00MB mem-reservation=4.00MB thread-reser
 |  |  |  |  build expressions: ics.i_item_sk
 |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  134:EXCHANGE [BROADCAST]
+|  |  |  136:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=9 row-size=20B cardinality=18.00K
-|  |  |  |  in pipelines: 11(GETNEXT)
+|  |  |  |  tuple-ids=10 row-size=20B cardinality=18.00K
+|  |  |  |  in pipelines: 12(GETNEXT)
 |  |  |  |
-|  |  |  F07:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F08:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  11:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
+|  |  |  12:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |     stored statistics:
 |  |  |       table: rows=18.00K size=1.73MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |     mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=0
-|  |  |     tuple-ids=9 row-size=20B cardinality=18.00K
-|  |  |     in pipelines: 11(GETNEXT)
+|  |  |     tuple-ids=10 row-size=20B cardinality=18.00K
+|  |  |     in pipelines: 12(GETNEXT)
 |  |  |
-|  |  10:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
+|  |  11:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
 |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |     stored statistics:
 |  |       table: rows=1.44M size=96.62MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |     mem-estimate=48.00MB mem-reservation=4.00MB thread-reservation=0
-|  |     tuple-ids=8 row-size=12B cardinality=1.44M
-|  |     in pipelines: 10(GETNEXT)
+|  |     tuple-ids=9 row-size=12B cardinality=1.44M
+|  |     in pipelines: 11(GETNEXT)
+|  |
+|  135:AGGREGATE [FINALIZE]
+|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 135(GETNEXT), 05(OPEN)
+|  |
+|  134:EXCHANGE [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)]
+|  |  mem-estimate=677.25KB mem-reservation=0B thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 05(GETNEXT)
+|  |
+|  F03:PLAN FRAGMENT [RANDOM] hosts=3 instances=6
+|  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.50MB thread-reservation=1
+|  10:AGGREGATE [STREAMING]
+|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 05(GETNEXT)
 |  |
 |  09:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  hash-table-id=20
diff --git a/testdata/workloads/functional-planner/queries/PlannerTest/tpcds/tpcds-q14b.test b/testdata/workloads/functional-planner/queries/PlannerTest/tpcds/tpcds-q14b.test
index bde95df..1846d02 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/tpcds/tpcds-q14b.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/tpcds/tpcds-q14b.test
@@ -129,10 +129,10 @@ ORDER BY this_year.channel,
          this_year.i_category_id
 LIMIT 100
 ---- PLAN
-Max Per-Host Resource Reservation: Memory=95.62MB Threads=33
+Max Per-Host Resource Reservation: Memory=99.88MB Threads=33
 Per-Host Resource Estimates: Memory=1.85GB
 F00:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
-|  Per-Host Resources: mem-estimate=1.85GB mem-reservation=95.62MB thread-reservation=33 runtime-filters-memory=10.00MB
+|  Per-Host Resources: mem-estimate=1.85GB mem-reservation=99.88MB thread-reservation=33 runtime-filters-memory=10.00MB
 PLAN-ROOT SINK
 |  output exprs: channel, i_brand_id, i_class_id, i_category_id, sales, number_sales, channel, i_brand_id, i_class_id, i_category_id, sales, number_sales
 |  mem-estimate=0B mem-reservation=0B thread-reservation=0
@@ -303,14 +303,14 @@ PLAN-ROOT SINK
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=114 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 74(GETNEXT), 68(OPEN)
+|  |  |  in pipelines: 74(GETNEXT), 54(OPEN)
 |  |  |
 |  |  69:HASH JOIN [INNER JOIN]
-|  |  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=53,40 row-size=32B cardinality=148.80K
-|  |  |  in pipelines: 68(GETNEXT), 48(OPEN)
+|  |  |  tuple-ids=44,40 row-size=32B cardinality=148.80K
+|  |  |  in pipelines: 54(GETNEXT), 48(OPEN)
 |  |  |
 |  |  |--48:SCAN HDFS [tpcds_parquet.item]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
@@ -322,32 +322,26 @@ PLAN-ROOT SINK
 |  |  |     tuple-ids=40 row-size=20B cardinality=18.00K
 |  |  |     in pipelines: 48(GETNEXT)
 |  |  |
-|  |  68:AGGREGATE [FINALIZE]
-|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=53 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 68(GETNEXT), 49(OPEN)
-|  |  |
-|  |  67:HASH JOIN [LEFT SEMI JOIN]
+|  |  68:HASH JOIN [LEFT SEMI JOIN]
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
 |  |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=41,42,43 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 49(GETNEXT), 66(OPEN)
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 54(GETNEXT), 67(OPEN)
 |  |  |
-|  |  |--66:AGGREGATE [FINALIZE]
+|  |  |--67:AGGREGATE [FINALIZE]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=112 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 66(GETNEXT), 59(OPEN)
+|  |  |  |  in pipelines: 67(GETNEXT), 60(OPEN)
 |  |  |  |
-|  |  |  63:HASH JOIN [INNER JOIN]
+|  |  |  64:HASH JOIN [INNER JOIN]
 |  |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=49,50,51 row-size=40B cardinality=719.38K
-|  |  |  |  in pipelines: 59(GETNEXT), 61(OPEN)
+|  |  |  |  tuple-ids=50,51,52 row-size=40B cardinality=719.38K
+|  |  |  |  in pipelines: 60(GETNEXT), 62(OPEN)
 |  |  |  |
-|  |  |  |--61:SCAN HDFS [tpcds_parquet.date_dim d3]
+|  |  |  |--62:SCAN HDFS [tpcds_parquet.date_dim d3]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -357,56 +351,56 @@ PLAN-ROOT SINK
 |  |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |     tuple-ids=51 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 61(GETNEXT)
+|  |  |  |     tuple-ids=52 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 62(GETNEXT)
 |  |  |  |
-|  |  |  62:HASH JOIN [INNER JOIN]
+|  |  |  63:HASH JOIN [INNER JOIN]
 |  |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=49,50 row-size=32B cardinality=719.38K
-|  |  |  |  in pipelines: 59(GETNEXT), 60(OPEN)
+|  |  |  |  tuple-ids=50,51 row-size=32B cardinality=719.38K
+|  |  |  |  in pipelines: 60(GETNEXT), 61(OPEN)
 |  |  |  |
-|  |  |  |--60:SCAN HDFS [tpcds_parquet.item iws]
+|  |  |  |--61:SCAN HDFS [tpcds_parquet.item iws]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |     tuple-ids=50 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 60(GETNEXT)
+|  |  |  |     tuple-ids=51 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 61(GETNEXT)
 |  |  |  |
-|  |  |  59:SCAN HDFS [tpcds_parquet.web_sales]
+|  |  |  60:SCAN HDFS [tpcds_parquet.web_sales]
 |  |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |  |     stored statistics:
 |  |  |       table: rows=719.38K size=45.09MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |  |     mem-estimate=64.00MB mem-reservation=4.00MB thread-reservation=1
-|  |  |     tuple-ids=49 row-size=12B cardinality=719.38K
-|  |  |     in pipelines: 59(GETNEXT)
+|  |  |     tuple-ids=50 row-size=12B cardinality=719.38K
+|  |  |     in pipelines: 60(GETNEXT)
 |  |  |
-|  |  65:HASH JOIN [LEFT SEMI JOIN]
+|  |  66:HASH JOIN [LEFT SEMI JOIN]
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
 |  |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=41,42,43 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 49(GETNEXT), 64(OPEN)
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 54(GETNEXT), 65(OPEN)
 |  |  |
-|  |  |--64:AGGREGATE [FINALIZE]
+|  |  |--65:AGGREGATE [FINALIZE]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=111 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 64(GETNEXT), 54(OPEN)
+|  |  |  |  in pipelines: 65(GETNEXT), 55(OPEN)
 |  |  |  |
-|  |  |  58:HASH JOIN [INNER JOIN]
+|  |  |  59:HASH JOIN [INNER JOIN]
 |  |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=45,46,47 row-size=40B cardinality=1.44M
-|  |  |  |  in pipelines: 54(GETNEXT), 56(OPEN)
+|  |  |  |  tuple-ids=46,47,48 row-size=40B cardinality=1.44M
+|  |  |  |  in pipelines: 55(GETNEXT), 57(OPEN)
 |  |  |  |
-|  |  |  |--56:SCAN HDFS [tpcds_parquet.date_dim d2]
+|  |  |  |--57:SCAN HDFS [tpcds_parquet.date_dim d2]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -416,35 +410,41 @@ PLAN-ROOT SINK
 |  |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |     tuple-ids=47 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 56(GETNEXT)
+|  |  |  |     tuple-ids=48 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 57(GETNEXT)
 |  |  |  |
-|  |  |  57:HASH JOIN [INNER JOIN]
+|  |  |  58:HASH JOIN [INNER JOIN]
 |  |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=45,46 row-size=32B cardinality=1.44M
-|  |  |  |  in pipelines: 54(GETNEXT), 55(OPEN)
+|  |  |  |  tuple-ids=46,47 row-size=32B cardinality=1.44M
+|  |  |  |  in pipelines: 55(GETNEXT), 56(OPEN)
 |  |  |  |
-|  |  |  |--55:SCAN HDFS [tpcds_parquet.item ics]
+|  |  |  |--56:SCAN HDFS [tpcds_parquet.item ics]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |     tuple-ids=46 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 55(GETNEXT)
+|  |  |  |     tuple-ids=47 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 56(GETNEXT)
 |  |  |  |
-|  |  |  54:SCAN HDFS [tpcds_parquet.catalog_sales]
+|  |  |  55:SCAN HDFS [tpcds_parquet.catalog_sales]
 |  |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |  |     stored statistics:
 |  |  |       table: rows=1.44M size=96.62MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |  |     mem-estimate=96.00MB mem-reservation=4.00MB thread-reservation=1
-|  |  |     tuple-ids=45 row-size=12B cardinality=1.44M
-|  |  |     in pipelines: 54(GETNEXT)
+|  |  |     tuple-ids=46 row-size=12B cardinality=1.44M
+|  |  |     in pipelines: 55(GETNEXT)
+|  |  |
+|  |  54:AGGREGATE [FINALIZE]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 54(GETNEXT), 49(OPEN)
 |  |  |
 |  |  53:HASH JOIN [INNER JOIN]
 |  |  |  hash predicates: ss_sold_date_sk = d1.d_date_sk
@@ -693,15 +693,15 @@ PLAN-ROOT SINK
 |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  tuple-ids=91 row-size=8B cardinality=17.98K
-|  |  in pipelines: 29(GETNEXT), 23(OPEN)
+|  |  in pipelines: 29(GETNEXT), 09(OPEN)
 |  |
 |  24:HASH JOIN [INNER JOIN]
-|  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  runtime filters: RF014[bloom] <- i_brand_id, RF015[bloom] <- i_category_id
 |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=16,3 row-size=32B cardinality=148.80K
-|  |  in pipelines: 23(GETNEXT), 03(OPEN)
+|  |  tuple-ids=7,3 row-size=32B cardinality=148.80K
+|  |  in pipelines: 09(GETNEXT), 03(OPEN)
 |  |
 |  |--03:SCAN HDFS [tpcds_parquet.item]
 |  |     HDFS partitions=1/1 files=1 size=1.73MB
@@ -713,32 +713,26 @@ PLAN-ROOT SINK
 |  |     tuple-ids=3 row-size=20B cardinality=18.00K
 |  |     in pipelines: 03(GETNEXT)
 |  |
-|  23:AGGREGATE [FINALIZE]
-|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 23(GETNEXT), 04(OPEN)
-|  |
-|  22:HASH JOIN [LEFT SEMI JOIN]
+|  23:HASH JOIN [LEFT SEMI JOIN]
 |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
 |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=4,5,6 row-size=40B cardinality=2.88M
-|  |  in pipelines: 04(GETNEXT), 21(OPEN)
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 09(GETNEXT), 22(OPEN)
 |  |
-|  |--21:AGGREGATE [FINALIZE]
+|  |--22:AGGREGATE [FINALIZE]
 |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  tuple-ids=89 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 21(GETNEXT), 14(OPEN)
+|  |  |  in pipelines: 22(GETNEXT), 15(OPEN)
 |  |  |
-|  |  18:HASH JOIN [INNER JOIN]
+|  |  19:HASH JOIN [INNER JOIN]
 |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=12,13,14 row-size=40B cardinality=719.38K
-|  |  |  in pipelines: 14(GETNEXT), 16(OPEN)
+|  |  |  tuple-ids=13,14,15 row-size=40B cardinality=719.38K
+|  |  |  in pipelines: 15(GETNEXT), 17(OPEN)
 |  |  |
-|  |  |--16:SCAN HDFS [tpcds_parquet.date_dim d3]
+|  |  |--17:SCAN HDFS [tpcds_parquet.date_dim d3]
 |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     stored statistics:
@@ -748,56 +742,56 @@ PLAN-ROOT SINK
 |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |     tuple-ids=14 row-size=8B cardinality=7.30K
-|  |  |     in pipelines: 16(GETNEXT)
+|  |  |     tuple-ids=15 row-size=8B cardinality=7.30K
+|  |  |     in pipelines: 17(GETNEXT)
 |  |  |
-|  |  17:HASH JOIN [INNER JOIN]
+|  |  18:HASH JOIN [INNER JOIN]
 |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=12,13 row-size=32B cardinality=719.38K
-|  |  |  in pipelines: 14(GETNEXT), 15(OPEN)
+|  |  |  tuple-ids=13,14 row-size=32B cardinality=719.38K
+|  |  |  in pipelines: 15(GETNEXT), 16(OPEN)
 |  |  |
-|  |  |--15:SCAN HDFS [tpcds_parquet.item iws]
+|  |  |--16:SCAN HDFS [tpcds_parquet.item iws]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |     stored statistics:
 |  |  |       table: rows=18.00K size=1.73MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |     tuple-ids=13 row-size=20B cardinality=18.00K
-|  |  |     in pipelines: 15(GETNEXT)
+|  |  |     tuple-ids=14 row-size=20B cardinality=18.00K
+|  |  |     in pipelines: 16(GETNEXT)
 |  |  |
-|  |  14:SCAN HDFS [tpcds_parquet.web_sales]
+|  |  15:SCAN HDFS [tpcds_parquet.web_sales]
 |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |     stored statistics:
 |  |       table: rows=719.38K size=45.09MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |     mem-estimate=64.00MB mem-reservation=4.00MB thread-reservation=1
-|  |     tuple-ids=12 row-size=12B cardinality=719.38K
-|  |     in pipelines: 14(GETNEXT)
+|  |     tuple-ids=13 row-size=12B cardinality=719.38K
+|  |     in pipelines: 15(GETNEXT)
 |  |
-|  20:HASH JOIN [LEFT SEMI JOIN]
+|  21:HASH JOIN [LEFT SEMI JOIN]
 |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
 |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=4,5,6 row-size=40B cardinality=2.88M
-|  |  in pipelines: 04(GETNEXT), 19(OPEN)
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 09(GETNEXT), 20(OPEN)
 |  |
-|  |--19:AGGREGATE [FINALIZE]
+|  |--20:AGGREGATE [FINALIZE]
 |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  tuple-ids=88 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 19(GETNEXT), 09(OPEN)
+|  |  |  in pipelines: 20(GETNEXT), 10(OPEN)
 |  |  |
-|  |  13:HASH JOIN [INNER JOIN]
+|  |  14:HASH JOIN [INNER JOIN]
 |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=8,9,10 row-size=40B cardinality=1.44M
-|  |  |  in pipelines: 09(GETNEXT), 11(OPEN)
+|  |  |  tuple-ids=9,10,11 row-size=40B cardinality=1.44M
+|  |  |  in pipelines: 10(GETNEXT), 12(OPEN)
 |  |  |
-|  |  |--11:SCAN HDFS [tpcds_parquet.date_dim d2]
+|  |  |--12:SCAN HDFS [tpcds_parquet.date_dim d2]
 |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     stored statistics:
@@ -807,35 +801,41 @@ PLAN-ROOT SINK
 |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |     tuple-ids=10 row-size=8B cardinality=7.30K
-|  |  |     in pipelines: 11(GETNEXT)
+|  |  |     tuple-ids=11 row-size=8B cardinality=7.30K
+|  |  |     in pipelines: 12(GETNEXT)
 |  |  |
-|  |  12:HASH JOIN [INNER JOIN]
+|  |  13:HASH JOIN [INNER JOIN]
 |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=8,9 row-size=32B cardinality=1.44M
-|  |  |  in pipelines: 09(GETNEXT), 10(OPEN)
+|  |  |  tuple-ids=9,10 row-size=32B cardinality=1.44M
+|  |  |  in pipelines: 10(GETNEXT), 11(OPEN)
 |  |  |
-|  |  |--10:SCAN HDFS [tpcds_parquet.item ics]
+|  |  |--11:SCAN HDFS [tpcds_parquet.item ics]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |     stored statistics:
 |  |  |       table: rows=18.00K size=1.73MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |     tuple-ids=9 row-size=20B cardinality=18.00K
-|  |  |     in pipelines: 10(GETNEXT)
+|  |  |     tuple-ids=10 row-size=20B cardinality=18.00K
+|  |  |     in pipelines: 11(GETNEXT)
 |  |  |
-|  |  09:SCAN HDFS [tpcds_parquet.catalog_sales]
+|  |  10:SCAN HDFS [tpcds_parquet.catalog_sales]
 |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |     stored statistics:
 |  |       table: rows=1.44M size=96.62MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |     mem-estimate=96.00MB mem-reservation=4.00MB thread-reservation=1
-|  |     tuple-ids=8 row-size=12B cardinality=1.44M
-|  |     in pipelines: 09(GETNEXT)
+|  |     tuple-ids=9 row-size=12B cardinality=1.44M
+|  |     in pipelines: 10(GETNEXT)
+|  |
+|  09:AGGREGATE [FINALIZE]
+|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  mem-estimate=10.00MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 09(GETNEXT), 04(OPEN)
 |  |
 |  08:HASH JOIN [INNER JOIN]
 |  |  hash predicates: ss_sold_date_sk = d1.d_date_sk
@@ -936,7 +936,7 @@ PLAN-ROOT SINK
    tuple-ids=0 row-size=20B cardinality=2.88M
    in pipelines: 00(GETNEXT)
 ---- DISTRIBUTEDPLAN
-Max Per-Host Resource Reservation: Memory=160.81MB Threads=86
+Max Per-Host Resource Reservation: Memory=157.06MB Threads=86
 Per-Host Resource Estimates: Memory=2.23GB
 F56:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=16.00KB mem-reservation=0B thread-reservation=1
@@ -1196,27 +1196,27 @@ Per-Host Resources: mem-estimate=25.00MB mem-reservation=8.81MB thread-reservati
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=114 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 140(GETNEXT), 137(OPEN)
+|  |  |  in pipelines: 140(GETNEXT), 127(OPEN)
 |  |  |
 |  |  139:EXCHANGE [HASH(tpcds_parquet.item.i_item_sk)]
 |  |  |  mem-estimate=82.81KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=114 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 137(GETNEXT)
+|  |  |  in pipelines: 127(GETNEXT)
 |  |  |
-|  |  F42:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=3
-|  |  Per-Host Resources: mem-estimate=22.92MB mem-reservation=5.88MB thread-reservation=1
+|  |  F34:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=3
+|  |  Per-Host Resources: mem-estimate=28.29MB mem-reservation=9.75MB thread-reservation=1
 |  |  74:AGGREGATE [STREAMING]
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=114 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 137(GETNEXT)
+|  |  |  in pipelines: 127(GETNEXT)
 |  |  |
 |  |  69:HASH JOIN [INNER JOIN, PARTITIONED]
-|  |  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=53,40 row-size=32B cardinality=148.80K
-|  |  |  in pipelines: 137(GETNEXT), 48(OPEN)
+|  |  |  tuple-ids=44,40 row-size=32B cardinality=148.80K
+|  |  |  in pipelines: 127(GETNEXT), 48(OPEN)
 |  |  |
 |  |  |--138:EXCHANGE [HASH(i_brand_id,i_class_id,i_category_id)]
 |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
@@ -1235,72 +1235,53 @@ Per-Host Resources: mem-estimate=25.00MB mem-reservation=8.81MB thread-reservati
 |  |  |     tuple-ids=40 row-size=20B cardinality=18.00K
 |  |  |     in pipelines: 48(GETNEXT)
 |  |  |
-|  |  137:AGGREGATE [FINALIZE]
-|  |  |  group by: $a$2.brand_id, $a$2.class_id, $a$2.category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=53 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 137(GETNEXT), 49(OPEN)
-|  |  |
-|  |  136:EXCHANGE [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)]
-|  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
-|  |  |  tuple-ids=53 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 49(GETNEXT)
-|  |  |
-|  |  F31:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  Per-Host Resources: mem-estimate=39.54MB mem-reservation=13.12MB thread-reservation=2
-|  |  68:AGGREGATE [STREAMING]
-|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=53 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 49(GETNEXT)
-|  |  |
-|  |  67:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  68:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
-|  |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=41,42,43 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 49(GETNEXT), 134(OPEN)
+|  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 127(GETNEXT), 136(OPEN)
 |  |  |
-|  |  |--135:EXCHANGE [BROADCAST]
-|  |  |  |  mem-estimate=1.73MB mem-reservation=0B thread-reservation=0
+|  |  |--137:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=112 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 134(GETNEXT)
+|  |  |  |  in pipelines: 136(GETNEXT)
 |  |  |  |
-|  |  |  F41:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
+|  |  |  F42:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
 |  |  |  Per-Host Resources: mem-estimate=10.88MB mem-reservation=1.94MB thread-reservation=1
-|  |  |  134:AGGREGATE [FINALIZE]
+|  |  |  136:AGGREGATE [FINALIZE]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  tuple-ids=112 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 134(GETNEXT), 59(OPEN)
+|  |  |  |  in pipelines: 136(GETNEXT), 60(OPEN)
 |  |  |  |
-|  |  |  133:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  135:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
 |  |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=112 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 59(GETNEXT)
+|  |  |  |  in pipelines: 60(GETNEXT)
 |  |  |  |
-|  |  |  F38:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
+|  |  |  F39:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  Per-Host Resources: mem-estimate=78.31MB mem-reservation=10.88MB thread-reservation=2
-|  |  |  66:AGGREGATE [STREAMING]
+|  |  |  67:AGGREGATE [STREAMING]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=112 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 59(GETNEXT)
+|  |  |  |  in pipelines: 60(GETNEXT)
 |  |  |  |
-|  |  |  63:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  64:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=49,50,51 row-size=40B cardinality=719.38K
-|  |  |  |  in pipelines: 59(GETNEXT), 61(OPEN)
+|  |  |  |  tuple-ids=50,51,52 row-size=40B cardinality=719.38K
+|  |  |  |  in pipelines: 60(GETNEXT), 62(OPEN)
 |  |  |  |
-|  |  |  |--132:EXCHANGE [BROADCAST]
+|  |  |  |--134:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=51 row-size=8B cardinality=7.30K
-|  |  |  |  |  in pipelines: 61(GETNEXT)
+|  |  |  |  |  tuple-ids=52 row-size=8B cardinality=7.30K
+|  |  |  |  |  in pipelines: 62(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F40:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F41:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Host Resources: mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=2
-|  |  |  |  61:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
+|  |  |  |  62:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -1310,90 +1291,90 @@ Per-Host Resources: mem-estimate=25.00MB mem-reservation=8.81MB thread-reservati
 |  |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |     tuple-ids=51 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 61(GETNEXT)
+|  |  |  |     tuple-ids=52 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 62(GETNEXT)
 |  |  |  |
-|  |  |  62:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  63:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=49,50 row-size=32B cardinality=719.38K
-|  |  |  |  in pipelines: 59(GETNEXT), 60(OPEN)
+|  |  |  |  tuple-ids=50,51 row-size=32B cardinality=719.38K
+|  |  |  |  in pipelines: 60(GETNEXT), 61(OPEN)
 |  |  |  |
-|  |  |  |--131:EXCHANGE [BROADCAST]
+|  |  |  |--133:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=50 row-size=20B cardinality=18.00K
-|  |  |  |  |  in pipelines: 60(GETNEXT)
+|  |  |  |  |  tuple-ids=51 row-size=20B cardinality=18.00K
+|  |  |  |  |  in pipelines: 61(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F39:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F40:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Host Resources: mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=2
-|  |  |  |  60:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
+|  |  |  |  61:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |     tuple-ids=50 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 60(GETNEXT)
+|  |  |  |     tuple-ids=51 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 61(GETNEXT)
 |  |  |  |
-|  |  |  59:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
+|  |  |  60:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
 |  |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |  |     stored statistics:
 |  |  |       table: rows=719.38K size=45.09MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |  |     mem-estimate=64.00MB mem-reservation=4.00MB thread-reservation=1
-|  |  |     tuple-ids=49 row-size=12B cardinality=719.38K
-|  |  |     in pipelines: 59(GETNEXT)
+|  |  |     tuple-ids=50 row-size=12B cardinality=719.38K
+|  |  |     in pipelines: 60(GETNEXT)
 |  |  |
-|  |  65:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  66:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
-|  |  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=41,42,43 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 49(GETNEXT), 129(OPEN)
+|  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 127(GETNEXT), 131(OPEN)
 |  |  |
-|  |  |--130:EXCHANGE [BROADCAST]
-|  |  |  |  mem-estimate=1.75MB mem-reservation=0B thread-reservation=0
+|  |  |--132:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=111 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 129(GETNEXT)
+|  |  |  |  in pipelines: 131(GETNEXT)
 |  |  |  |
-|  |  |  F37:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
+|  |  |  F38:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
 |  |  |  Per-Host Resources: mem-estimate=10.61MB mem-reservation=1.94MB thread-reservation=1
-|  |  |  129:AGGREGATE [FINALIZE]
+|  |  |  131:AGGREGATE [FINALIZE]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  tuple-ids=111 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 129(GETNEXT), 54(OPEN)
+|  |  |  |  in pipelines: 131(GETNEXT), 55(OPEN)
 |  |  |  |
-|  |  |  128:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  130:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
 |  |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=111 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 54(GETNEXT)
+|  |  |  |  in pipelines: 55(GETNEXT)
 |  |  |  |
-|  |  |  F34:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  |  F35:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  Per-Host Resources: mem-estimate=110.31MB mem-reservation=10.88MB thread-reservation=2
-|  |  |  64:AGGREGATE [STREAMING]
+|  |  |  65:AGGREGATE [STREAMING]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=111 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 54(GETNEXT)
+|  |  |  |  in pipelines: 55(GETNEXT)
 |  |  |  |
-|  |  |  58:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  59:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=45,46,47 row-size=40B cardinality=1.44M
-|  |  |  |  in pipelines: 54(GETNEXT), 56(OPEN)
+|  |  |  |  tuple-ids=46,47,48 row-size=40B cardinality=1.44M
+|  |  |  |  in pipelines: 55(GETNEXT), 57(OPEN)
 |  |  |  |
-|  |  |  |--127:EXCHANGE [BROADCAST]
+|  |  |  |--129:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=47 row-size=8B cardinality=7.30K
-|  |  |  |  |  in pipelines: 56(GETNEXT)
+|  |  |  |  |  tuple-ids=48 row-size=8B cardinality=7.30K
+|  |  |  |  |  in pipelines: 57(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F36:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F37:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Host Resources: mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=2
-|  |  |  |  56:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
+|  |  |  |  57:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -1403,42 +1384,61 @@ Per-Host Resources: mem-estimate=25.00MB mem-reservation=8.81MB thread-reservati
 |  |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |     tuple-ids=47 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 56(GETNEXT)
+|  |  |  |     tuple-ids=48 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 57(GETNEXT)
 |  |  |  |
-|  |  |  57:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  58:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=45,46 row-size=32B cardinality=1.44M
-|  |  |  |  in pipelines: 54(GETNEXT), 55(OPEN)
+|  |  |  |  tuple-ids=46,47 row-size=32B cardinality=1.44M
+|  |  |  |  in pipelines: 55(GETNEXT), 56(OPEN)
 |  |  |  |
-|  |  |  |--126:EXCHANGE [BROADCAST]
+|  |  |  |--128:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=46 row-size=20B cardinality=18.00K
-|  |  |  |  |  in pipelines: 55(GETNEXT)
+|  |  |  |  |  tuple-ids=47 row-size=20B cardinality=18.00K
+|  |  |  |  |  in pipelines: 56(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F35:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F36:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Host Resources: mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=2
-|  |  |  |  55:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
+|  |  |  |  56:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |     tuple-ids=46 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 55(GETNEXT)
+|  |  |  |     tuple-ids=47 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 56(GETNEXT)
 |  |  |  |
-|  |  |  54:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
+|  |  |  55:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
 |  |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |  |     stored statistics:
 |  |  |       table: rows=1.44M size=96.62MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |  |     mem-estimate=96.00MB mem-reservation=4.00MB thread-reservation=1
-|  |  |     tuple-ids=45 row-size=12B cardinality=1.44M
-|  |  |     in pipelines: 54(GETNEXT)
+|  |  |     tuple-ids=46 row-size=12B cardinality=1.44M
+|  |  |     in pipelines: 55(GETNEXT)
+|  |  |
+|  |  127:AGGREGATE [FINALIZE]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 127(GETNEXT), 49(OPEN)
+|  |  |
+|  |  126:EXCHANGE [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)]
+|  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 49(GETNEXT)
+|  |  |
+|  |  F31:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  Per-Host Resources: mem-estimate=30.31MB mem-reservation=7.38MB thread-reservation=2
+|  |  54:AGGREGATE [STREAMING]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 49(GETNEXT)
 |  |  |
 |  |  53:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash predicates: ss_sold_date_sk = d1.d_date_sk
@@ -1792,28 +1792,28 @@ Per-Host Resources: mem-estimate=70.87MB mem-reservation=14.75MB thread-reservat
 |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  tuple-ids=91 row-size=8B cardinality=17.98K
-|  |  in pipelines: 110(GETNEXT), 107(OPEN)
+|  |  in pipelines: 110(GETNEXT), 97(OPEN)
 |  |
 |  109:EXCHANGE [HASH(tpcds_parquet.item.i_item_sk)]
 |  |  mem-estimate=82.81KB mem-reservation=0B thread-reservation=0
 |  |  tuple-ids=91 row-size=8B cardinality=17.98K
-|  |  in pipelines: 107(GETNEXT)
+|  |  in pipelines: 97(GETNEXT)
 |  |
-|  F14:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=3
-|  Per-Host Resources: mem-estimate=24.92MB mem-reservation=7.88MB thread-reservation=1 runtime-filters-memory=2.00MB
+|  F06:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=3
+|  Per-Host Resources: mem-estimate=30.29MB mem-reservation=11.75MB thread-reservation=1 runtime-filters-memory=2.00MB
 |  29:AGGREGATE [STREAMING]
 |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
 |  |  tuple-ids=91 row-size=8B cardinality=17.98K
-|  |  in pipelines: 107(GETNEXT)
+|  |  in pipelines: 97(GETNEXT)
 |  |
 |  24:HASH JOIN [INNER JOIN, PARTITIONED]
-|  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  runtime filters: RF014[bloom] <- i_brand_id, RF015[bloom] <- i_category_id
 |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=16,3 row-size=32B cardinality=148.80K
-|  |  in pipelines: 107(GETNEXT), 03(OPEN)
+|  |  tuple-ids=7,3 row-size=32B cardinality=148.80K
+|  |  in pipelines: 97(GETNEXT), 03(OPEN)
 |  |
 |  |--108:EXCHANGE [HASH(i_brand_id,i_class_id,i_category_id)]
 |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
@@ -1832,72 +1832,53 @@ Per-Host Resources: mem-estimate=70.87MB mem-reservation=14.75MB thread-reservat
 |  |     tuple-ids=3 row-size=20B cardinality=18.00K
 |  |     in pipelines: 03(GETNEXT)
 |  |
-|  107:AGGREGATE [FINALIZE]
-|  |  group by: $a$2.brand_id, $a$2.class_id, $a$2.category_id
-|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 107(GETNEXT), 04(OPEN)
-|  |
-|  106:EXCHANGE [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)]
-|  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 04(GETNEXT)
-|  |
-|  F03:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  Per-Host Resources: mem-estimate=39.54MB mem-reservation=13.12MB thread-reservation=2
-|  23:AGGREGATE [STREAMING]
-|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 04(GETNEXT)
-|  |
-|  22:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  23:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
-|  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=4,5,6 row-size=40B cardinality=2.88M
-|  |  in pipelines: 04(GETNEXT), 104(OPEN)
+|  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 97(GETNEXT), 106(OPEN)
 |  |
-|  |--105:EXCHANGE [BROADCAST]
-|  |  |  mem-estimate=1.73MB mem-reservation=0B thread-reservation=0
+|  |--107:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=89 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 104(GETNEXT)
+|  |  |  in pipelines: 106(GETNEXT)
 |  |  |
-|  |  F13:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
+|  |  F14:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
 |  |  Per-Host Resources: mem-estimate=10.88MB mem-reservation=1.94MB thread-reservation=1
-|  |  104:AGGREGATE [FINALIZE]
+|  |  106:AGGREGATE [FINALIZE]
 |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=89 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 104(GETNEXT), 14(OPEN)
+|  |  |  in pipelines: 106(GETNEXT), 15(OPEN)
 |  |  |
-|  |  103:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  105:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
 |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=89 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 14(GETNEXT)
+|  |  |  in pipelines: 15(GETNEXT)
 |  |  |
-|  |  F10:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
+|  |  F11:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  Per-Host Resources: mem-estimate=78.31MB mem-reservation=10.88MB thread-reservation=2
-|  |  21:AGGREGATE [STREAMING]
+|  |  22:AGGREGATE [STREAMING]
 |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  tuple-ids=89 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 14(GETNEXT)
+|  |  |  in pipelines: 15(GETNEXT)
 |  |  |
-|  |  18:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  19:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=12,13,14 row-size=40B cardinality=719.38K
-|  |  |  in pipelines: 14(GETNEXT), 16(OPEN)
+|  |  |  tuple-ids=13,14,15 row-size=40B cardinality=719.38K
+|  |  |  in pipelines: 15(GETNEXT), 17(OPEN)
 |  |  |
-|  |  |--102:EXCHANGE [BROADCAST]
+|  |  |--104:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=14 row-size=8B cardinality=7.30K
-|  |  |  |  in pipelines: 16(GETNEXT)
+|  |  |  |  tuple-ids=15 row-size=8B cardinality=7.30K
+|  |  |  |  in pipelines: 17(GETNEXT)
 |  |  |  |
-|  |  |  F12:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F13:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Host Resources: mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=2
-|  |  |  16:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
+|  |  |  17:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     stored statistics:
@@ -1907,90 +1888,90 @@ Per-Host Resources: mem-estimate=70.87MB mem-reservation=14.75MB thread-reservat
 |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |     tuple-ids=14 row-size=8B cardinality=7.30K
-|  |  |     in pipelines: 16(GETNEXT)
+|  |  |     tuple-ids=15 row-size=8B cardinality=7.30K
+|  |  |     in pipelines: 17(GETNEXT)
 |  |  |
-|  |  17:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  18:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=12,13 row-size=32B cardinality=719.38K
-|  |  |  in pipelines: 14(GETNEXT), 15(OPEN)
+|  |  |  tuple-ids=13,14 row-size=32B cardinality=719.38K
+|  |  |  in pipelines: 15(GETNEXT), 16(OPEN)
 |  |  |
-|  |  |--101:EXCHANGE [BROADCAST]
+|  |  |--103:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=13 row-size=20B cardinality=18.00K
-|  |  |  |  in pipelines: 15(GETNEXT)
+|  |  |  |  tuple-ids=14 row-size=20B cardinality=18.00K
+|  |  |  |  in pipelines: 16(GETNEXT)
 |  |  |  |
-|  |  |  F11:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F12:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Host Resources: mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=2
-|  |  |  15:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
+|  |  |  16:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |     stored statistics:
 |  |  |       table: rows=18.00K size=1.73MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |     tuple-ids=13 row-size=20B cardinality=18.00K
-|  |  |     in pipelines: 15(GETNEXT)
+|  |  |     tuple-ids=14 row-size=20B cardinality=18.00K
+|  |  |     in pipelines: 16(GETNEXT)
 |  |  |
-|  |  14:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
+|  |  15:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
 |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |     stored statistics:
 |  |       table: rows=719.38K size=45.09MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |     mem-estimate=64.00MB mem-reservation=4.00MB thread-reservation=1
-|  |     tuple-ids=12 row-size=12B cardinality=719.38K
-|  |     in pipelines: 14(GETNEXT)
+|  |     tuple-ids=13 row-size=12B cardinality=719.38K
+|  |     in pipelines: 15(GETNEXT)
 |  |
-|  20:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  21:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
-|  |  mem-estimate=2.88MB mem-reservation=2.88MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=4,5,6 row-size=40B cardinality=2.88M
-|  |  in pipelines: 04(GETNEXT), 99(OPEN)
+|  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 97(GETNEXT), 101(OPEN)
 |  |
-|  |--100:EXCHANGE [BROADCAST]
-|  |  |  mem-estimate=1.75MB mem-reservation=0B thread-reservation=0
+|  |--102:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=88 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 99(GETNEXT)
+|  |  |  in pipelines: 101(GETNEXT)
 |  |  |
-|  |  F09:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
+|  |  F10:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
 |  |  Per-Host Resources: mem-estimate=10.61MB mem-reservation=1.94MB thread-reservation=1
-|  |  99:AGGREGATE [FINALIZE]
+|  |  101:AGGREGATE [FINALIZE]
 |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=88 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 99(GETNEXT), 09(OPEN)
+|  |  |  in pipelines: 101(GETNEXT), 10(OPEN)
 |  |  |
-|  |  98:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  100:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
 |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=88 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 09(GETNEXT)
+|  |  |  in pipelines: 10(GETNEXT)
 |  |  |
-|  |  F06:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  F07:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  Per-Host Resources: mem-estimate=110.31MB mem-reservation=10.88MB thread-reservation=2
-|  |  19:AGGREGATE [STREAMING]
+|  |  20:AGGREGATE [STREAMING]
 |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  tuple-ids=88 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 09(GETNEXT)
+|  |  |  in pipelines: 10(GETNEXT)
 |  |  |
-|  |  13:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  14:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=8,9,10 row-size=40B cardinality=1.44M
-|  |  |  in pipelines: 09(GETNEXT), 11(OPEN)
+|  |  |  tuple-ids=9,10,11 row-size=40B cardinality=1.44M
+|  |  |  in pipelines: 10(GETNEXT), 12(OPEN)
 |  |  |
-|  |  |--97:EXCHANGE [BROADCAST]
+|  |  |--99:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=10 row-size=8B cardinality=7.30K
-|  |  |  |  in pipelines: 11(GETNEXT)
+|  |  |  |  tuple-ids=11 row-size=8B cardinality=7.30K
+|  |  |  |  in pipelines: 12(GETNEXT)
 |  |  |  |
-|  |  |  F08:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F09:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Host Resources: mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=2
-|  |  |  11:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
+|  |  |  12:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     stored statistics:
@@ -2000,42 +1981,61 @@ Per-Host Resources: mem-estimate=70.87MB mem-reservation=14.75MB thread-reservat
 |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     mem-estimate=32.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |     tuple-ids=10 row-size=8B cardinality=7.30K
-|  |  |     in pipelines: 11(GETNEXT)
+|  |  |     tuple-ids=11 row-size=8B cardinality=7.30K
+|  |  |     in pipelines: 12(GETNEXT)
 |  |  |
-|  |  12:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  13:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=8,9 row-size=32B cardinality=1.44M
-|  |  |  in pipelines: 09(GETNEXT), 10(OPEN)
+|  |  |  tuple-ids=9,10 row-size=32B cardinality=1.44M
+|  |  |  in pipelines: 10(GETNEXT), 11(OPEN)
 |  |  |
-|  |  |--96:EXCHANGE [BROADCAST]
+|  |  |--98:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=9 row-size=20B cardinality=18.00K
-|  |  |  |  in pipelines: 10(GETNEXT)
+|  |  |  |  tuple-ids=10 row-size=20B cardinality=18.00K
+|  |  |  |  in pipelines: 11(GETNEXT)
 |  |  |  |
-|  |  |  F07:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F08:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Host Resources: mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=2
-|  |  |  10:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
+|  |  |  11:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |     stored statistics:
 |  |  |       table: rows=18.00K size=1.73MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |     mem-estimate=64.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |     tuple-ids=9 row-size=20B cardinality=18.00K
-|  |  |     in pipelines: 10(GETNEXT)
+|  |  |     tuple-ids=10 row-size=20B cardinality=18.00K
+|  |  |     in pipelines: 11(GETNEXT)
 |  |  |
-|  |  09:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
+|  |  10:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
 |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |     stored statistics:
 |  |       table: rows=1.44M size=96.62MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |     mem-estimate=96.00MB mem-reservation=4.00MB thread-reservation=1
-|  |     tuple-ids=8 row-size=12B cardinality=1.44M
-|  |     in pipelines: 09(GETNEXT)
+|  |     tuple-ids=9 row-size=12B cardinality=1.44M
+|  |     in pipelines: 10(GETNEXT)
+|  |
+|  97:AGGREGATE [FINALIZE]
+|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 97(GETNEXT), 04(OPEN)
+|  |
+|  96:EXCHANGE [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)]
+|  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 04(GETNEXT)
+|  |
+|  F03:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  Per-Host Resources: mem-estimate=30.31MB mem-reservation=7.38MB thread-reservation=2
+|  09:AGGREGATE [STREAMING]
+|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 04(GETNEXT)
 |  |
 |  08:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  hash predicates: ss_sold_date_sk = d1.d_date_sk
@@ -2164,7 +2164,7 @@ Per-Host Resources: mem-estimate=70.87MB mem-reservation=14.75MB thread-reservat
    tuple-ids=0 row-size=20B cardinality=2.88M
    in pipelines: 00(GETNEXT)
 ---- PARALLELPLANS
-Max Per-Host Resource Reservation: Memory=280.88MB Threads=99
+Max Per-Host Resource Reservation: Memory=273.38MB Threads=103
 Per-Host Resource Estimates: Memory=1.42GB
 F56:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Instance Resources: mem-estimate=16.00KB mem-reservation=0B thread-reservation=1
@@ -2479,30 +2479,30 @@ Per-Instance Resources: mem-estimate=10.07MB mem-reservation=1.94MB thread-reser
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=114 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 140(GETNEXT), 137(OPEN)
+|  |  |  in pipelines: 140(GETNEXT), 127(OPEN)
 |  |  |
 |  |  139:EXCHANGE [HASH(tpcds_parquet.item.i_item_sk)]
 |  |  |  mem-estimate=118.81KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=114 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 137(GETNEXT)
+|  |  |  in pipelines: 127(GETNEXT)
 |  |  |
-|  |  F42:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=6
+|  |  F34:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
 |  |  Per-Instance Resources: mem-estimate=20.66MB mem-reservation=3.94MB thread-reservation=1
 |  |  74:AGGREGATE [STREAMING]
 |  |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=114 row-size=8B cardinality=17.98K
-|  |  |  in pipelines: 137(GETNEXT)
+|  |  |  in pipelines: 127(GETNEXT)
 |  |  |
 |  |  69:HASH JOIN [INNER JOIN, PARTITIONED]
 |  |  |  hash-table-id=07
-|  |  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=53,40 row-size=32B cardinality=148.80K
-|  |  |  in pipelines: 137(GETNEXT), 48(OPEN)
+|  |  |  tuple-ids=44,40 row-size=32B cardinality=148.80K
+|  |  |  in pipelines: 127(GETNEXT), 48(OPEN)
 |  |  |
-|  |  |--F64:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=6
+|  |  |--F64:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
 |  |  |  |  Per-Instance Resources: mem-estimate=2.30MB mem-reservation=1.94MB thread-reservation=1
 |  |  |  JOIN BUILD
 |  |  |  |  join-table-id=07 plan-id=08 cohort-id=04
@@ -2526,72 +2526,53 @@ Per-Instance Resources: mem-estimate=10.07MB mem-reservation=1.94MB thread-reser
 |  |  |     tuple-ids=40 row-size=20B cardinality=18.00K
 |  |  |     in pipelines: 48(GETNEXT)
 |  |  |
-|  |  137:AGGREGATE [FINALIZE]
-|  |  |  group by: $a$2.brand_id, $a$2.class_id, $a$2.category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=53 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 137(GETNEXT), 49(OPEN)
-|  |  |
-|  |  136:EXCHANGE [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)]
-|  |  |  mem-estimate=677.25KB mem-reservation=0B thread-reservation=0
-|  |  |  tuple-ids=53 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 49(GETNEXT)
-|  |  |
-|  |  F31:PLAN FRAGMENT [RANDOM] hosts=3 instances=6
-|  |  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.50MB thread-reservation=1
-|  |  68:AGGREGATE [STREAMING]
-|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=53 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 49(GETNEXT)
-|  |  |
-|  |  67:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  68:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  |  hash-table-id=08
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
-|  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=41,42,43 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 49(GETNEXT), 134(OPEN)
+|  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 127(GETNEXT), 136(OPEN)
 |  |  |
-|  |  |--F65:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  |  |  Per-Instance Resources: mem-estimate=7.48MB mem-reservation=5.75MB thread-reservation=1
+|  |  |--F65:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
+|  |  |  |  Per-Instance Resources: mem-estimate=2.82MB mem-reservation=1.94MB thread-reservation=1
 |  |  |  JOIN BUILD
 |  |  |  |  join-table-id=08 plan-id=09 cohort-id=04
 |  |  |  |  build expressions: iws.i_brand_id, iws.i_category_id, iws.i_class_id
-|  |  |  |  mem-estimate=5.75MB mem-reservation=5.75MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  135:EXCHANGE [BROADCAST]
-|  |  |  |  mem-estimate=1.73MB mem-reservation=0B thread-reservation=0
+|  |  |  137:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=112 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 134(GETNEXT)
+|  |  |  |  in pipelines: 136(GETNEXT)
 |  |  |  |
-|  |  |  F41:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
+|  |  |  F42:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
 |  |  |  Per-Instance Resources: mem-estimate=10.88MB mem-reservation=1.94MB thread-reservation=1
-|  |  |  134:AGGREGATE [FINALIZE]
+|  |  |  136:AGGREGATE [FINALIZE]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  tuple-ids=112 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 134(GETNEXT), 59(OPEN)
+|  |  |  |  in pipelines: 136(GETNEXT), 60(OPEN)
 |  |  |  |
-|  |  |  133:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  135:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
 |  |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=112 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 59(GETNEXT)
+|  |  |  |  in pipelines: 60(GETNEXT)
 |  |  |  |
-|  |  |  F38:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
+|  |  |  F39:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  Per-Instance Resources: mem-estimate=42.00MB mem-reservation=7.00MB thread-reservation=1
-|  |  |  66:AGGREGATE [STREAMING]
+|  |  |  67:AGGREGATE [STREAMING]
 |  |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=112 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 59(GETNEXT)
+|  |  |  |  in pipelines: 60(GETNEXT)
 |  |  |  |
-|  |  |  63:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  64:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash-table-id=09
 |  |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=49,50,51 row-size=40B cardinality=719.38K
-|  |  |  |  in pipelines: 59(GETNEXT), 61(OPEN)
+|  |  |  |  tuple-ids=50,51,52 row-size=40B cardinality=719.38K
+|  |  |  |  in pipelines: 60(GETNEXT), 62(OPEN)
 |  |  |  |
 |  |  |  |--F66:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  |  |  Per-Instance Resources: mem-estimate=3.94MB mem-reservation=3.88MB thread-reservation=1
@@ -2600,14 +2581,14 @@ Per-Instance Resources: mem-estimate=10.07MB mem-reservation=1.94MB thread-reser
 |  |  |  |  |  build expressions: d3.d_date_sk
 |  |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  |
-|  |  |  |  132:EXCHANGE [BROADCAST]
+|  |  |  |  134:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=51 row-size=8B cardinality=7.30K
-|  |  |  |  |  in pipelines: 61(GETNEXT)
+|  |  |  |  |  tuple-ids=52 row-size=8B cardinality=7.30K
+|  |  |  |  |  in pipelines: 62(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F40:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F41:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |  61:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
+|  |  |  |  62:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -2617,16 +2598,16 @@ Per-Instance Resources: mem-estimate=10.07MB mem-reservation=1.94MB thread-reser
 |  |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=0
-|  |  |  |     tuple-ids=51 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 61(GETNEXT)
+|  |  |  |     tuple-ids=52 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 62(GETNEXT)
 |  |  |  |
-|  |  |  62:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  63:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash-table-id=10
 |  |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=49,50 row-size=32B cardinality=719.38K
-|  |  |  |  in pipelines: 59(GETNEXT), 60(OPEN)
+|  |  |  |  tuple-ids=50,51 row-size=32B cardinality=719.38K
+|  |  |  |  in pipelines: 60(GETNEXT), 61(OPEN)
 |  |  |  |
 |  |  |  |--F67:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  |  |  Per-Instance Resources: mem-estimate=4.24MB mem-reservation=3.88MB thread-reservation=1
@@ -2635,80 +2616,80 @@ Per-Instance Resources: mem-estimate=10.07MB mem-reservation=1.94MB thread-reser
 |  |  |  |  |  build expressions: iws.i_item_sk
 |  |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  |
-|  |  |  |  131:EXCHANGE [BROADCAST]
+|  |  |  |  133:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=50 row-size=20B cardinality=18.00K
-|  |  |  |  |  in pipelines: 60(GETNEXT)
+|  |  |  |  |  tuple-ids=51 row-size=20B cardinality=18.00K
+|  |  |  |  |  in pipelines: 61(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F39:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F40:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |  60:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
+|  |  |  |  61:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=0
-|  |  |  |     tuple-ids=50 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 60(GETNEXT)
+|  |  |  |     tuple-ids=51 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 61(GETNEXT)
 |  |  |  |
-|  |  |  59:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
+|  |  |  60:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
 |  |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |  |     stored statistics:
 |  |  |       table: rows=719.38K size=45.09MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |  |     mem-estimate=32.00MB mem-reservation=4.00MB thread-reservation=0
-|  |  |     tuple-ids=49 row-size=12B cardinality=719.38K
-|  |  |     in pipelines: 59(GETNEXT)
+|  |  |     tuple-ids=50 row-size=12B cardinality=719.38K
+|  |  |     in pipelines: 60(GETNEXT)
 |  |  |
-|  |  65:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  |  66:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  |  hash-table-id=11
 |  |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
-|  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=128.00KB thread-reservation=0
-|  |  |  tuple-ids=41,42,43 row-size=40B cardinality=2.88M
-|  |  |  in pipelines: 49(GETNEXT), 129(OPEN)
+|  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 127(GETNEXT), 131(OPEN)
 |  |  |
-|  |  |--F68:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  |  |  Per-Instance Resources: mem-estimate=7.50MB mem-reservation=5.75MB thread-reservation=1
+|  |  |--F68:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
+|  |  |  |  Per-Instance Resources: mem-estimate=2.55MB mem-reservation=1.94MB thread-reservation=1
 |  |  |  JOIN BUILD
 |  |  |  |  join-table-id=11 plan-id=12 cohort-id=04
 |  |  |  |  build expressions: ics.i_brand_id, ics.i_category_id, ics.i_class_id
-|  |  |  |  mem-estimate=5.75MB mem-reservation=5.75MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  130:EXCHANGE [BROADCAST]
-|  |  |  |  mem-estimate=1.75MB mem-reservation=0B thread-reservation=0
+|  |  |  132:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=111 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 129(GETNEXT)
+|  |  |  |  in pipelines: 131(GETNEXT)
 |  |  |  |
-|  |  |  F37:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
+|  |  |  F38:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
 |  |  |  Per-Instance Resources: mem-estimate=10.61MB mem-reservation=1.94MB thread-reservation=1
-|  |  |  129:AGGREGATE [FINALIZE]
+|  |  |  131:AGGREGATE [FINALIZE]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  tuple-ids=111 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 129(GETNEXT), 54(OPEN)
+|  |  |  |  in pipelines: 131(GETNEXT), 55(OPEN)
 |  |  |  |
-|  |  |  128:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  130:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
 |  |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  |  tuple-ids=111 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 54(GETNEXT)
+|  |  |  |  in pipelines: 55(GETNEXT)
 |  |  |  |
-|  |  |  F34:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  |  F35:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  Per-Instance Resources: mem-estimate=58.00MB mem-reservation=7.00MB thread-reservation=1
-|  |  |  64:AGGREGATE [STREAMING]
+|  |  |  65:AGGREGATE [STREAMING]
 |  |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  |  tuple-ids=111 row-size=12B cardinality=148.80K
-|  |  |  |  in pipelines: 54(GETNEXT)
+|  |  |  |  in pipelines: 55(GETNEXT)
 |  |  |  |
-|  |  |  58:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  59:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash-table-id=12
 |  |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=45,46,47 row-size=40B cardinality=1.44M
-|  |  |  |  in pipelines: 54(GETNEXT), 56(OPEN)
+|  |  |  |  tuple-ids=46,47,48 row-size=40B cardinality=1.44M
+|  |  |  |  in pipelines: 55(GETNEXT), 57(OPEN)
 |  |  |  |
 |  |  |  |--F69:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  |  |  Per-Instance Resources: mem-estimate=3.94MB mem-reservation=3.88MB thread-reservation=1
@@ -2717,14 +2698,14 @@ Per-Instance Resources: mem-estimate=10.07MB mem-reservation=1.94MB thread-reser
 |  |  |  |  |  build expressions: d2.d_date_sk
 |  |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  |
-|  |  |  |  127:EXCHANGE [BROADCAST]
+|  |  |  |  129:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=47 row-size=8B cardinality=7.30K
-|  |  |  |  |  in pipelines: 56(GETNEXT)
+|  |  |  |  |  tuple-ids=48 row-size=8B cardinality=7.30K
+|  |  |  |  |  in pipelines: 57(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F36:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F37:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  |  56:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
+|  |  |  |  57:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     stored statistics:
@@ -2734,16 +2715,16 @@ Per-Instance Resources: mem-estimate=10.07MB mem-reservation=1.94MB thread-reser
 |  |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |  |     mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=0
-|  |  |  |     tuple-ids=47 row-size=8B cardinality=7.30K
-|  |  |  |     in pipelines: 56(GETNEXT)
+|  |  |  |     tuple-ids=48 row-size=8B cardinality=7.30K
+|  |  |  |     in pipelines: 57(GETNEXT)
 |  |  |  |
-|  |  |  57:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  |  58:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  |  hash-table-id=13
 |  |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  |  tuple-ids=45,46 row-size=32B cardinality=1.44M
-|  |  |  |  in pipelines: 54(GETNEXT), 55(OPEN)
+|  |  |  |  tuple-ids=46,47 row-size=32B cardinality=1.44M
+|  |  |  |  in pipelines: 55(GETNEXT), 56(OPEN)
 |  |  |  |
 |  |  |  |--F70:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  |  |  Per-Instance Resources: mem-estimate=4.24MB mem-reservation=3.88MB thread-reservation=1
@@ -2752,32 +2733,51 @@ Per-Instance Resources: mem-estimate=10.07MB mem-reservation=1.94MB thread-reser
 |  |  |  |  |  build expressions: ics.i_item_sk
 |  |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |  |
-|  |  |  |  126:EXCHANGE [BROADCAST]
+|  |  |  |  128:EXCHANGE [BROADCAST]
 |  |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  |  tuple-ids=46 row-size=20B cardinality=18.00K
-|  |  |  |  |  in pipelines: 55(GETNEXT)
+|  |  |  |  |  tuple-ids=47 row-size=20B cardinality=18.00K
+|  |  |  |  |  in pipelines: 56(GETNEXT)
 |  |  |  |  |
-|  |  |  |  F35:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  |  F36:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  |  55:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
+|  |  |  |  56:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
 |  |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |  |     stored statistics:
 |  |  |  |       table: rows=18.00K size=1.73MB
 |  |  |  |       columns: all
 |  |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |  |     mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=0
-|  |  |  |     tuple-ids=46 row-size=20B cardinality=18.00K
-|  |  |  |     in pipelines: 55(GETNEXT)
+|  |  |  |     tuple-ids=47 row-size=20B cardinality=18.00K
+|  |  |  |     in pipelines: 56(GETNEXT)
 |  |  |  |
-|  |  |  54:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
+|  |  |  55:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
 |  |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |  |     stored statistics:
 |  |  |       table: rows=1.44M size=96.62MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |  |     mem-estimate=48.00MB mem-reservation=4.00MB thread-reservation=0
-|  |  |     tuple-ids=45 row-size=12B cardinality=1.44M
-|  |  |     in pipelines: 54(GETNEXT)
+|  |  |     tuple-ids=46 row-size=12B cardinality=1.44M
+|  |  |     in pipelines: 55(GETNEXT)
+|  |  |
+|  |  127:AGGREGATE [FINALIZE]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 127(GETNEXT), 49(OPEN)
+|  |  |
+|  |  126:EXCHANGE [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)]
+|  |  |  mem-estimate=677.25KB mem-reservation=0B thread-reservation=0
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 49(GETNEXT)
+|  |  |
+|  |  F31:PLAN FRAGMENT [RANDOM] hosts=3 instances=6
+|  |  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.50MB thread-reservation=1
+|  |  54:AGGREGATE [STREAMING]
+|  |  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  tuple-ids=44 row-size=12B cardinality=148.80K
+|  |  |  in pipelines: 49(GETNEXT)
 |  |  |
 |  |  53:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash-table-id=14
@@ -3212,30 +3212,30 @@ Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.00MB thread-reser
 |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  tuple-ids=91 row-size=8B cardinality=17.98K
-|  |  in pipelines: 110(GETNEXT), 107(OPEN)
+|  |  in pipelines: 110(GETNEXT), 97(OPEN)
 |  |
 |  109:EXCHANGE [HASH(tpcds_parquet.item.i_item_sk)]
 |  |  mem-estimate=118.81KB mem-reservation=0B thread-reservation=0
 |  |  tuple-ids=91 row-size=8B cardinality=17.98K
-|  |  in pipelines: 107(GETNEXT)
+|  |  in pipelines: 97(GETNEXT)
 |  |
-|  F14:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=6
+|  F06:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
 |  Per-Instance Resources: mem-estimate=20.66MB mem-reservation=3.94MB thread-reservation=1
 |  29:AGGREGATE [STREAMING]
 |  |  group by: tpcds_parquet.item.i_item_sk
 |  |  mem-estimate=10.00MB mem-reservation=2.00MB spill-buffer=64.00KB thread-reservation=0
 |  |  tuple-ids=91 row-size=8B cardinality=17.98K
-|  |  in pipelines: 107(GETNEXT)
+|  |  in pipelines: 97(GETNEXT)
 |  |
 |  24:HASH JOIN [INNER JOIN, PARTITIONED]
 |  |  hash-table-id=24
-|  |  hash predicates: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
-|  |  fk/pk conjuncts: $a$2.brand_id = i_brand_id, $a$2.category_id = i_category_id, $a$2.class_id = i_class_id
+|  |  hash predicates: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
+|  |  fk/pk conjuncts: iss.i_brand_id = i_brand_id, iss.i_category_id = i_category_id, iss.i_class_id = i_class_id
 |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=16,3 row-size=32B cardinality=148.80K
-|  |  in pipelines: 107(GETNEXT), 03(OPEN)
+|  |  tuple-ids=7,3 row-size=32B cardinality=148.80K
+|  |  in pipelines: 97(GETNEXT), 03(OPEN)
 |  |
-|  |--F81:PLAN FRAGMENT [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)] hosts=3 instances=6
+|  |--F81:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
 |  |  |  Per-Instance Resources: mem-estimate=4.30MB mem-reservation=3.94MB thread-reservation=1 runtime-filters-memory=2.00MB
 |  |  JOIN BUILD
 |  |  |  join-table-id=24 plan-id=25 cohort-id=08
@@ -3260,72 +3260,53 @@ Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.00MB thread-reser
 |  |     tuple-ids=3 row-size=20B cardinality=18.00K
 |  |     in pipelines: 03(GETNEXT)
 |  |
-|  107:AGGREGATE [FINALIZE]
-|  |  group by: $a$2.brand_id, $a$2.class_id, $a$2.category_id
-|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 107(GETNEXT), 04(OPEN)
-|  |
-|  106:EXCHANGE [HASH($a$2.brand_id,$a$2.class_id,$a$2.category_id)]
-|  |  mem-estimate=677.25KB mem-reservation=0B thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 04(GETNEXT)
-|  |
-|  F03:PLAN FRAGMENT [RANDOM] hosts=3 instances=6
-|  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.50MB thread-reservation=1
-|  23:AGGREGATE [STREAMING]
-|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
-|  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=16 row-size=12B cardinality=148.80K
-|  |  in pipelines: 04(GETNEXT)
-|  |
-|  22:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  23:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  hash-table-id=25
 |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM iws.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM iws.i_category_id, iss.i_class_id IS NOT DISTINCT FROM iws.i_class_id
-|  |  mem-estimate=0B mem-reservation=0B spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=4,5,6 row-size=40B cardinality=2.88M
-|  |  in pipelines: 04(GETNEXT), 104(OPEN)
+|  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 97(GETNEXT), 106(OPEN)
 |  |
-|  |--F82:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  |  Per-Instance Resources: mem-estimate=7.48MB mem-reservation=5.75MB thread-reservation=1
+|  |--F82:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
+|  |  |  Per-Instance Resources: mem-estimate=2.82MB mem-reservation=1.94MB thread-reservation=1
 |  |  JOIN BUILD
 |  |  |  join-table-id=25 plan-id=26 cohort-id=08
 |  |  |  build expressions: iws.i_brand_id, iws.i_category_id, iws.i_class_id
-|  |  |  mem-estimate=5.75MB mem-reservation=5.75MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |
-|  |  105:EXCHANGE [BROADCAST]
-|  |  |  mem-estimate=1.73MB mem-reservation=0B thread-reservation=0
+|  |  107:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=89 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 104(GETNEXT)
+|  |  |  in pipelines: 106(GETNEXT)
 |  |  |
-|  |  F13:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
+|  |  F14:PLAN FRAGMENT [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)] hosts=2 instances=2
 |  |  Per-Instance Resources: mem-estimate=10.88MB mem-reservation=1.94MB thread-reservation=1
-|  |  104:AGGREGATE [FINALIZE]
+|  |  106:AGGREGATE [FINALIZE]
 |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=89 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 104(GETNEXT), 14(OPEN)
+|  |  |  in pipelines: 106(GETNEXT), 15(OPEN)
 |  |  |
-|  |  103:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
+|  |  105:EXCHANGE [HASH(iws.i_brand_id,iws.i_class_id,iws.i_category_id)]
 |  |  |  mem-estimate=903.88KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=89 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 14(GETNEXT)
+|  |  |  in pipelines: 15(GETNEXT)
 |  |  |
-|  |  F10:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
+|  |  F11:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  Per-Instance Resources: mem-estimate=42.00MB mem-reservation=7.00MB thread-reservation=1
-|  |  21:AGGREGATE [STREAMING]
+|  |  22:AGGREGATE [STREAMING]
 |  |  |  group by: iws.i_brand_id, iws.i_class_id, iws.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  tuple-ids=89 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 14(GETNEXT)
+|  |  |  in pipelines: 15(GETNEXT)
 |  |  |
-|  |  18:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  19:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash-table-id=26
 |  |  |  hash predicates: ws_sold_date_sk = d3.d_date_sk
 |  |  |  fk/pk conjuncts: ws_sold_date_sk = d3.d_date_sk
 |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=12,13,14 row-size=40B cardinality=719.38K
-|  |  |  in pipelines: 14(GETNEXT), 16(OPEN)
+|  |  |  tuple-ids=13,14,15 row-size=40B cardinality=719.38K
+|  |  |  in pipelines: 15(GETNEXT), 17(OPEN)
 |  |  |
 |  |  |--F83:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  |  Per-Instance Resources: mem-estimate=3.94MB mem-reservation=3.88MB thread-reservation=1
@@ -3334,14 +3315,14 @@ Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.00MB thread-reser
 |  |  |  |  build expressions: d3.d_date_sk
 |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  102:EXCHANGE [BROADCAST]
+|  |  |  104:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=14 row-size=8B cardinality=7.30K
-|  |  |  |  in pipelines: 16(GETNEXT)
+|  |  |  |  tuple-ids=15 row-size=8B cardinality=7.30K
+|  |  |  |  in pipelines: 17(GETNEXT)
 |  |  |  |
-|  |  |  F12:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F13:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  16:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
+|  |  |  17:SCAN HDFS [tpcds_parquet.date_dim d3, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |     predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     stored statistics:
@@ -3351,16 +3332,16 @@ Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.00MB thread-reser
 |  |  |     parquet statistics predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     parquet dictionary predicates: d3.d_year <= CAST(2001 AS INT), d3.d_year >= CAST(1999 AS INT)
 |  |  |     mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=0
-|  |  |     tuple-ids=14 row-size=8B cardinality=7.30K
-|  |  |     in pipelines: 16(GETNEXT)
+|  |  |     tuple-ids=15 row-size=8B cardinality=7.30K
+|  |  |     in pipelines: 17(GETNEXT)
 |  |  |
-|  |  17:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  18:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash-table-id=27
 |  |  |  hash predicates: ws_item_sk = iws.i_item_sk
 |  |  |  fk/pk conjuncts: ws_item_sk = iws.i_item_sk
 |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=12,13 row-size=32B cardinality=719.38K
-|  |  |  in pipelines: 14(GETNEXT), 15(OPEN)
+|  |  |  tuple-ids=13,14 row-size=32B cardinality=719.38K
+|  |  |  in pipelines: 15(GETNEXT), 16(OPEN)
 |  |  |
 |  |  |--F84:PLAN FRAGMENT [RANDOM] hosts=2 instances=2
 |  |  |  |  Per-Instance Resources: mem-estimate=4.24MB mem-reservation=3.88MB thread-reservation=1
@@ -3369,80 +3350,80 @@ Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.00MB thread-reser
 |  |  |  |  build expressions: iws.i_item_sk
 |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  101:EXCHANGE [BROADCAST]
+|  |  |  103:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=13 row-size=20B cardinality=18.00K
-|  |  |  |  in pipelines: 15(GETNEXT)
+|  |  |  |  tuple-ids=14 row-size=20B cardinality=18.00K
+|  |  |  |  in pipelines: 16(GETNEXT)
 |  |  |  |
-|  |  |  F11:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F12:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  15:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
+|  |  |  16:SCAN HDFS [tpcds_parquet.item iws, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |     stored statistics:
 |  |  |       table: rows=18.00K size=1.73MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |     mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=0
-|  |  |     tuple-ids=13 row-size=20B cardinality=18.00K
-|  |  |     in pipelines: 15(GETNEXT)
+|  |  |     tuple-ids=14 row-size=20B cardinality=18.00K
+|  |  |     in pipelines: 16(GETNEXT)
 |  |  |
-|  |  14:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
+|  |  15:SCAN HDFS [tpcds_parquet.web_sales, RANDOM]
 |  |     HDFS partitions=1/1 files=2 size=45.09MB
 |  |     stored statistics:
 |  |       table: rows=719.38K size=45.09MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=644.77K
 |  |     mem-estimate=32.00MB mem-reservation=4.00MB thread-reservation=0
-|  |     tuple-ids=12 row-size=12B cardinality=719.38K
-|  |     in pipelines: 14(GETNEXT)
+|  |     tuple-ids=13 row-size=12B cardinality=719.38K
+|  |     in pipelines: 15(GETNEXT)
 |  |
-|  20:HASH JOIN [LEFT SEMI JOIN, BROADCAST]
+|  21:HASH JOIN [LEFT SEMI JOIN, PARTITIONED]
 |  |  hash-table-id=28
 |  |  hash predicates: iss.i_brand_id IS NOT DISTINCT FROM ics.i_brand_id, iss.i_category_id IS NOT DISTINCT FROM ics.i_category_id, iss.i_class_id IS NOT DISTINCT FROM ics.i_class_id
-|  |  mem-estimate=0B mem-reservation=0B spill-buffer=128.00KB thread-reservation=0
-|  |  tuple-ids=4,5,6 row-size=40B cardinality=2.88M
-|  |  in pipelines: 04(GETNEXT), 99(OPEN)
+|  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 97(GETNEXT), 101(OPEN)
 |  |
-|  |--F85:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
-|  |  |  Per-Instance Resources: mem-estimate=7.50MB mem-reservation=5.75MB thread-reservation=1
+|  |--F85:PLAN FRAGMENT [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)] hosts=3 instances=6
+|  |  |  Per-Instance Resources: mem-estimate=2.55MB mem-reservation=1.94MB thread-reservation=1
 |  |  JOIN BUILD
 |  |  |  join-table-id=28 plan-id=29 cohort-id=08
 |  |  |  build expressions: ics.i_brand_id, ics.i_category_id, ics.i_class_id
-|  |  |  mem-estimate=5.75MB mem-reservation=5.75MB spill-buffer=128.00KB thread-reservation=0
+|  |  |  mem-estimate=1.94MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |
-|  |  100:EXCHANGE [BROADCAST]
-|  |  |  mem-estimate=1.75MB mem-reservation=0B thread-reservation=0
+|  |  102:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=88 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 99(GETNEXT)
+|  |  |  in pipelines: 101(GETNEXT)
 |  |  |
-|  |  F09:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
+|  |  F10:PLAN FRAGMENT [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)] hosts=3 instances=3
 |  |  Per-Instance Resources: mem-estimate=10.61MB mem-reservation=1.94MB thread-reservation=1
-|  |  99:AGGREGATE [FINALIZE]
+|  |  101:AGGREGATE [FINALIZE]
 |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  tuple-ids=88 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 99(GETNEXT), 09(OPEN)
+|  |  |  in pipelines: 101(GETNEXT), 10(OPEN)
 |  |  |
-|  |  98:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
+|  |  100:EXCHANGE [HASH(ics.i_brand_id,ics.i_class_id,ics.i_category_id)]
 |  |  |  mem-estimate=629.25KB mem-reservation=0B thread-reservation=0
 |  |  |  tuple-ids=88 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 09(GETNEXT)
+|  |  |  in pipelines: 10(GETNEXT)
 |  |  |
-|  |  F06:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
+|  |  F07:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  Per-Instance Resources: mem-estimate=58.00MB mem-reservation=7.00MB thread-reservation=1
-|  |  19:AGGREGATE [STREAMING]
+|  |  20:AGGREGATE [STREAMING]
 |  |  |  group by: ics.i_brand_id, ics.i_class_id, ics.i_category_id
 |  |  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
 |  |  |  tuple-ids=88 row-size=12B cardinality=148.80K
-|  |  |  in pipelines: 09(GETNEXT)
+|  |  |  in pipelines: 10(GETNEXT)
 |  |  |
-|  |  13:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  14:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash-table-id=29
 |  |  |  hash predicates: cs_sold_date_sk = d2.d_date_sk
 |  |  |  fk/pk conjuncts: cs_sold_date_sk = d2.d_date_sk
 |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=8,9,10 row-size=40B cardinality=1.44M
-|  |  |  in pipelines: 09(GETNEXT), 11(OPEN)
+|  |  |  tuple-ids=9,10,11 row-size=40B cardinality=1.44M
+|  |  |  in pipelines: 10(GETNEXT), 12(OPEN)
 |  |  |
 |  |  |--F86:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  |  Per-Instance Resources: mem-estimate=3.94MB mem-reservation=3.88MB thread-reservation=1
@@ -3451,14 +3432,14 @@ Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.00MB thread-reser
 |  |  |  |  build expressions: d2.d_date_sk
 |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  97:EXCHANGE [BROADCAST]
+|  |  |  99:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=69.07KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=10 row-size=8B cardinality=7.30K
-|  |  |  |  in pipelines: 11(GETNEXT)
+|  |  |  |  tuple-ids=11 row-size=8B cardinality=7.30K
+|  |  |  |  in pipelines: 12(GETNEXT)
 |  |  |  |
-|  |  |  F08:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F09:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=1
-|  |  |  11:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
+|  |  |  12:SCAN HDFS [tpcds_parquet.date_dim d2, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=2.15MB
 |  |  |     predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     stored statistics:
@@ -3468,16 +3449,16 @@ Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.00MB thread-reser
 |  |  |     parquet statistics predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     parquet dictionary predicates: d2.d_year <= CAST(2001 AS INT), d2.d_year >= CAST(1999 AS INT)
 |  |  |     mem-estimate=16.00MB mem-reservation=512.00KB thread-reservation=0
-|  |  |     tuple-ids=10 row-size=8B cardinality=7.30K
-|  |  |     in pipelines: 11(GETNEXT)
+|  |  |     tuple-ids=11 row-size=8B cardinality=7.30K
+|  |  |     in pipelines: 12(GETNEXT)
 |  |  |
-|  |  12:HASH JOIN [INNER JOIN, BROADCAST]
+|  |  13:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  |  hash-table-id=30
 |  |  |  hash predicates: cs_item_sk = ics.i_item_sk
 |  |  |  fk/pk conjuncts: cs_item_sk = ics.i_item_sk
 |  |  |  mem-estimate=0B mem-reservation=0B spill-buffer=64.00KB thread-reservation=0
-|  |  |  tuple-ids=8,9 row-size=32B cardinality=1.44M
-|  |  |  in pipelines: 09(GETNEXT), 10(OPEN)
+|  |  |  tuple-ids=9,10 row-size=32B cardinality=1.44M
+|  |  |  in pipelines: 10(GETNEXT), 11(OPEN)
 |  |  |
 |  |  |--F87:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
 |  |  |  |  Per-Instance Resources: mem-estimate=4.24MB mem-reservation=3.88MB thread-reservation=1
@@ -3486,32 +3467,51 @@ Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.00MB thread-reser
 |  |  |  |  build expressions: ics.i_item_sk
 |  |  |  |  mem-estimate=3.88MB mem-reservation=3.88MB spill-buffer=64.00KB thread-reservation=0
 |  |  |  |
-|  |  |  96:EXCHANGE [BROADCAST]
+|  |  |  98:EXCHANGE [BROADCAST]
 |  |  |  |  mem-estimate=375.56KB mem-reservation=0B thread-reservation=0
-|  |  |  |  tuple-ids=9 row-size=20B cardinality=18.00K
-|  |  |  |  in pipelines: 10(GETNEXT)
+|  |  |  |  tuple-ids=10 row-size=20B cardinality=18.00K
+|  |  |  |  in pipelines: 11(GETNEXT)
 |  |  |  |
-|  |  |  F07:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
+|  |  |  F08:PLAN FRAGMENT [RANDOM] hosts=1 instances=1
 |  |  |  Per-Instance Resources: mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=1
-|  |  |  10:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
+|  |  |  11:SCAN HDFS [tpcds_parquet.item ics, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=1.73MB
 |  |  |     stored statistics:
 |  |  |       table: rows=18.00K size=1.73MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=18.00K
 |  |  |     mem-estimate=16.00MB mem-reservation=256.00KB thread-reservation=0
-|  |  |     tuple-ids=9 row-size=20B cardinality=18.00K
-|  |  |     in pipelines: 10(GETNEXT)
+|  |  |     tuple-ids=10 row-size=20B cardinality=18.00K
+|  |  |     in pipelines: 11(GETNEXT)
 |  |  |
-|  |  09:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
+|  |  10:SCAN HDFS [tpcds_parquet.catalog_sales, RANDOM]
 |  |     HDFS partitions=1/1 files=3 size=96.62MB
 |  |     stored statistics:
 |  |       table: rows=1.44M size=96.62MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=650.14K
 |  |     mem-estimate=48.00MB mem-reservation=4.00MB thread-reservation=0
-|  |     tuple-ids=8 row-size=12B cardinality=1.44M
-|  |     in pipelines: 09(GETNEXT)
+|  |     tuple-ids=9 row-size=12B cardinality=1.44M
+|  |     in pipelines: 10(GETNEXT)
+|  |
+|  97:AGGREGATE [FINALIZE]
+|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  mem-estimate=10.00MB mem-reservation=1.94MB spill-buffer=64.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 97(GETNEXT), 04(OPEN)
+|  |
+|  96:EXCHANGE [HASH(iss.i_brand_id,iss.i_class_id,iss.i_category_id)]
+|  |  mem-estimate=677.25KB mem-reservation=0B thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 04(GETNEXT)
+|  |
+|  F03:PLAN FRAGMENT [RANDOM] hosts=3 instances=6
+|  Per-Instance Resources: mem-estimate=26.00MB mem-reservation=3.50MB thread-reservation=1
+|  09:AGGREGATE [STREAMING]
+|  |  group by: iss.i_brand_id, iss.i_class_id, iss.i_category_id
+|  |  mem-estimate=10.00MB mem-reservation=3.00MB spill-buffer=128.00KB thread-reservation=0
+|  |  tuple-ids=7 row-size=12B cardinality=148.80K
+|  |  in pipelines: 04(GETNEXT)
 |  |
 |  08:HASH JOIN [INNER JOIN, BROADCAST]
 |  |  hash-table-id=31