You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@asterixdb.apache.org by AsterixDB Code Review <do...@asterix-gerrit.ics.uci.edu> on 2026/09/10 22:30:26 UTC

[L] Change in asterixdb[master]: [ASTERIXDB-3830][COMP] Enable hash-based COUNT(DISTINCT) by default

From Shahrzad Shirazi <sh...@ucr.edu>:

Shahrzad Shirazi has uploaded this change for review. ( https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/21739?usp=email )


Change subject: [ASTERIXDB-3830][COMP] Enable hash-based COUNT(DISTINCT) by default
......................................................................

[ASTERIXDB-3830][COMP] Enable hash-based COUNT(DISTINCT) by default

Change-Id: I3abfe8c99e68959a20c1b0a7022b698dec75db30
---
M asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.15.plan
M asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.16.plan
M asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.3.plan
M asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.4.plan
M asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.8.plan
M asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.10.plan
M asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.14.plan
M asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.9.plan
M asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/cbo-join/computed-join-predicate.plan
M asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q16.plan
M asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1/cluster_state_1.1.regexadm
M asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_full/cluster_state_1_full.1.regexadm
M asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_less/cluster_state_1_less.1.regexadm
M asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.020.plan
M hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/config/AlgebricksConfig.java
15 files changed, 465 insertions(+), 461 deletions(-)



  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb refs/changes/39/21739/1

diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.15.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.15.plan
index 46d05cb..5fbb4ac 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.15.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.15.plan
@@ -1,8 +1,8 @@
-distribute result [$$122]
+distribute result [$$139]
 -- DISTRIBUTE_RESULT  |LOCAL|
   exchange
   -- ONE_TO_ONE_EXCHANGE  |LOCAL|
-    assign [$$122] <- [{"sum_distinct_x": $$123, "sum_y": $$124, "sum_distinct_z": $$125, "avg_distinct_x": $$126, "avg_distinct_y": $$127, "count_x": $$128, "count_distinct_y": $$129, "avg_z": $$130, "count_distinct_z": $$131}] project: [$$122]
+    assign [$$139] <- [{"sum_distinct_x": $$140, "sum_y": $$141, "sum_distinct_z": $$142, "avg_distinct_x": $$143, "avg_distinct_y": $$144, "count_x": $$145, "count_distinct_y": $$146, "avg_z": $$147, "count_distinct_z": $$148}] project: [$$139]
     -- ASSIGN  |LOCAL|
       exchange
       -- ONE_TO_ONE_EXCHANGE  |LOCAL|
@@ -18,16 +18,16 @@
                 -- NESTED_LOOP  |LOCAL|
                   exchange
                   -- ONE_TO_ONE_EXCHANGE  |LOCAL|
-                    aggregate [$$123, $$126] <- [agg-sql-sum($$141), agg-sql-avg($$141)]
+                    aggregate [$$140, $$143] <- [agg-sql-sum($$158), agg-sql-avg($$158)]
                     -- AGGREGATE  |LOCAL|
                       exchange
                       -- ONE_TO_ONE_EXCHANGE  |LOCAL|
-                        distinct ([$$141])
+                        distinct ([$$158])
                         -- PRE_SORTED_DISTINCT_BY  |LOCAL|
                           exchange
                           -- ONE_TO_ONE_EXCHANGE  |LOCAL|
-                            order (ASC, $$141)
-                            -- STABLE_SORT [$$141(ASC)]  |LOCAL|
+                            order (ASC, $$158)
+                            -- STABLE_SORT [$$158(ASC)]  |LOCAL|
                               exchange
                               -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
                                 join (true)
@@ -42,14 +42,18 @@
                                         -- REPLICATE  |UNPARTITIONED|
                                           exchange
                                           -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                            replicate
-                                            -- REPLICATE  |UNPARTITIONED|
+                                            assign [$$158] <- [$$182] project: [$$158]
+                                            -- ASSIGN  |UNPARTITIONED|
                                               exchange
                                               -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                unnest $$141 <- range(1, 5)
-                                                -- UNNEST  |UNPARTITIONED|
-                                                  empty-tuple-source
-                                                  -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+                                                replicate
+                                                -- REPLICATE  |UNPARTITIONED|
+                                                  exchange
+                                                  -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                                                    unnest $$182 <- range(1, 5)
+                                                    -- UNNEST  |UNPARTITIONED|
+                                                      empty-tuple-source
+                                                      -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
                                       exchange
                                       -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
                                         replicate
@@ -64,7 +68,7 @@
                                                 -- REPLICATE  |UNPARTITIONED|
                                                   exchange
                                                   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                    unnest $$142 <- range(6, 10)
+                                                    unnest $$159 <- range(6, 10)
                                                     -- UNNEST  |UNPARTITIONED|
                                                       empty-tuple-source
                                                       -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
@@ -82,94 +86,100 @@
                                             -- REPLICATE  |UNPARTITIONED|
                                               exchange
                                               -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                unnest $$143 <- range(11, 15)
+                                                unnest $$160 <- range(11, 15)
                                                 -- UNNEST  |UNPARTITIONED|
                                                   empty-tuple-source
                                                   -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
                   exchange
-                  -- ONE_TO_ONE_EXCHANGE  |LOCAL|
-                    aggregate [$$124, $$128, $$130] <- [agg-global-sql-sum($$168), agg-sql-sum($$169), agg-global-sql-avg($$170)]
-                    -- AGGREGATE  |LOCAL|
-                      aggregate [$$168, $$169, $$170] <- [agg-local-sql-sum($$154), agg-sql-count($$153), agg-local-sql-avg($$155)]
-                      -- AGGREGATE  |LOCAL|
-                        exchange
-                        -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                          join (true)
-                          -- NESTED_LOOP  |UNPARTITIONED|
-                            exchange
-                            -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                              join (true)
-                              -- NESTED_LOOP  |UNPARTITIONED|
-                                exchange
-                                -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                  assign [$$153] <- [$$141] project: [$$153]
-                                  -- ASSIGN  |UNPARTITIONED|
-                                    exchange
-                                    -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                      replicate
-                                      -- REPLICATE  |UNPARTITIONED|
-                                        exchange
-                                        -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                          replicate
-                                          -- REPLICATE  |UNPARTITIONED|
-                                            exchange
-                                            -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                              unnest $$141 <- range(1, 5)
-                                              -- UNNEST  |UNPARTITIONED|
-                                                empty-tuple-source
-                                                -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
-                                exchange
-                                -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                  replicate
-                                  -- REPLICATE  |UNPARTITIONED|
-                                    exchange
-                                    -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                      assign [$$154] <- [$$142] project: [$$154]
-                                      -- ASSIGN  |UNPARTITIONED|
-                                        exchange
-                                        -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                          replicate
-                                          -- REPLICATE  |UNPARTITIONED|
-                                            exchange
-                                            -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                              unnest $$142 <- range(6, 10)
-                                              -- UNNEST  |UNPARTITIONED|
-                                                empty-tuple-source
-                                                -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
-                            exchange
-                            -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                              assign [$$155] <- [$$167] project: [$$155]
-                              -- ASSIGN  |UNPARTITIONED|
-                                exchange
-                                -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                  replicate
-                                  -- REPLICATE  |UNPARTITIONED|
-                                    exchange
-                                    -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                      assign [$$167] <- [$$143] project: [$$167]
-                                      -- ASSIGN  |UNPARTITIONED|
-                                        exchange
-                                        -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                          replicate
-                                          -- REPLICATE  |UNPARTITIONED|
-                                            exchange
-                                            -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                              unnest $$143 <- range(11, 15)
-                                              -- UNNEST  |UNPARTITIONED|
-                                                empty-tuple-source
-                                                -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                    aggregate [$$141, $$145, $$146, $$147, $$148] <- [agg-sql-sum($$171), agg-sql-count($$170), agg-sql-count-distinct-hash($$171), agg-sql-avg($$172), agg-sql-count-distinct-hash($$172)]
+                    -- AGGREGATE  |UNPARTITIONED|
+                      exchange
+                      -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                        join (true)
+                        -- NESTED_LOOP  |UNPARTITIONED|
+                          exchange
+                          -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                            join (true)
+                            -- NESTED_LOOP  |UNPARTITIONED|
+                              exchange
+                              -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                                assign [$$170] <- [$$158] project: [$$170]
+                                -- ASSIGN  |UNPARTITIONED|
+                                  exchange
+                                  -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                                    replicate
+                                    -- REPLICATE  |UNPARTITIONED|
+                                      exchange
+                                      -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                                        assign [$$158] <- [$$182] project: [$$158]
+                                        -- ASSIGN  |UNPARTITIONED|
+                                          exchange
+                                          -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                                            replicate
+                                            -- REPLICATE  |UNPARTITIONED|
+                                              exchange
+                                              -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                                                unnest $$182 <- range(1, 5)
+                                                -- UNNEST  |UNPARTITIONED|
+                                                  empty-tuple-source
+                                                  -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+                              exchange
+                              -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                                assign [$$171] <- [$$y] project: [$$171]
+                                -- ASSIGN  |UNPARTITIONED|
+                                  exchange
+                                  -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                                    replicate
+                                    -- REPLICATE  |UNPARTITIONED|
+                                      exchange
+                                      -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                                        assign [$$y] <- [$$159] project: [$$y]
+                                        -- ASSIGN  |UNPARTITIONED|
+                                          exchange
+                                          -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                                            replicate
+                                            -- REPLICATE  |UNPARTITIONED|
+                                              exchange
+                                              -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                                                unnest $$159 <- range(6, 10)
+                                                -- UNNEST  |UNPARTITIONED|
+                                                  empty-tuple-source
+                                                  -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+                          exchange
+                          -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                            assign [$$172] <- [$$184] project: [$$172]
+                            -- ASSIGN  |UNPARTITIONED|
+                              exchange
+                              -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                                replicate
+                                -- REPLICATE  |UNPARTITIONED|
+                                  exchange
+                                  -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                                    assign [$$184] <- [$$160] project: [$$184]
+                                    -- ASSIGN  |UNPARTITIONED|
+                                      exchange
+                                      -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                                        replicate
+                                        -- REPLICATE  |UNPARTITIONED|
+                                          exchange
+                                          -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                                            unnest $$160 <- range(11, 15)
+                                            -- UNNEST  |UNPARTITIONED|
+                                              empty-tuple-source
+                                              -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
               exchange
               -- ONE_TO_ONE_EXCHANGE  |LOCAL|
-                aggregate [$$125, $$131] <- [agg-sql-sum($$167), agg-sql-count($$167)]
+                aggregate [$$142] <- [agg-sql-sum($$184)]
                 -- AGGREGATE  |LOCAL|
                   exchange
                   -- ONE_TO_ONE_EXCHANGE  |LOCAL|
-                    distinct ([$$167])
+                    distinct ([$$184])
                     -- PRE_SORTED_DISTINCT_BY  |LOCAL|
                       exchange
                       -- ONE_TO_ONE_EXCHANGE  |LOCAL|
-                        order (ASC, $$167)
-                        -- STABLE_SORT [$$167(ASC)]  |LOCAL|
+                        order (ASC, $$184)
+                        -- STABLE_SORT [$$184(ASC)]  |LOCAL|
                           exchange
                           -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
                             join (true)
@@ -184,15 +194,15 @@
                                     -- REPLICATE  |UNPARTITIONED|
                                       exchange
                                       -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                        assign [$$165] <- [$$141] project: []
-                                        -- ASSIGN  |UNPARTITIONED|
+                                        project ([])
+                                        -- STREAM_PROJECT  |UNPARTITIONED|
                                           exchange
                                           -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
                                             replicate
                                             -- REPLICATE  |UNPARTITIONED|
                                               exchange
                                               -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                unnest $$141 <- range(1, 5)
+                                                unnest $$182 <- range(1, 5)
                                                 -- UNNEST  |UNPARTITIONED|
                                                   empty-tuple-source
                                                   -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
@@ -214,7 +224,7 @@
                                                 -- REPLICATE  |UNPARTITIONED|
                                                   exchange
                                                   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                    unnest $$142 <- range(6, 10)
+                                                    unnest $$159 <- range(6, 10)
                                                     -- UNNEST  |UNPARTITIONED|
                                                       empty-tuple-source
                                                       -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
@@ -224,7 +234,7 @@
                                 -- REPLICATE  |UNPARTITIONED|
                                   exchange
                                   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                    assign [$$167] <- [$$143] project: [$$167]
+                                    assign [$$184] <- [$$160] project: [$$184]
                                     -- ASSIGN  |UNPARTITIONED|
                                       exchange
                                       -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
@@ -232,13 +242,13 @@
                                         -- REPLICATE  |UNPARTITIONED|
                                           exchange
                                           -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                            unnest $$143 <- range(11, 15)
+                                            unnest $$160 <- range(11, 15)
                                             -- UNNEST  |UNPARTITIONED|
                                               empty-tuple-source
                                               -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
           exchange
           -- ONE_TO_ONE_EXCHANGE  |LOCAL|
-            aggregate [$$127, $$129] <- [agg-sql-avg($$y), agg-sql-count($$y)]
+            aggregate [$$144] <- [agg-sql-avg($$y)]
             -- AGGREGATE  |LOCAL|
               exchange
               -- ONE_TO_ONE_EXCHANGE  |LOCAL|
@@ -266,40 +276,36 @@
                                     -- REPLICATE  |UNPARTITIONED|
                                       exchange
                                       -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                        assign [$$165] <- [$$141] project: []
-                                        -- ASSIGN  |UNPARTITIONED|
+                                        project ([])
+                                        -- STREAM_PROJECT  |UNPARTITIONED|
                                           exchange
                                           -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
                                             replicate
                                             -- REPLICATE  |UNPARTITIONED|
                                               exchange
                                               -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                unnest $$141 <- range(1, 5)
+                                                unnest $$182 <- range(1, 5)
                                                 -- UNNEST  |UNPARTITIONED|
                                                   empty-tuple-source
                                                   -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
                               exchange
                               -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                assign [$$y] <- [$$154] project: [$$y]
-                                -- ASSIGN  |UNPARTITIONED|
+                                replicate
+                                -- REPLICATE  |UNPARTITIONED|
                                   exchange
                                   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                    replicate
-                                    -- REPLICATE  |UNPARTITIONED|
+                                    assign [$$y] <- [$$159] project: [$$y]
+                                    -- ASSIGN  |UNPARTITIONED|
                                       exchange
                                       -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                        assign [$$154] <- [$$142] project: [$$154]
-                                        -- ASSIGN  |UNPARTITIONED|
+                                        replicate
+                                        -- REPLICATE  |UNPARTITIONED|
                                           exchange
                                           -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                            replicate
-                                            -- REPLICATE  |UNPARTITIONED|
-                                              exchange
-                                              -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                unnest $$142 <- range(6, 10)
-                                                -- UNNEST  |UNPARTITIONED|
-                                                  empty-tuple-source
-                                                  -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+                                            unnest $$159 <- range(6, 10)
+                                            -- UNNEST  |UNPARTITIONED|
+                                              empty-tuple-source
+                                              -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
                           exchange
                           -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
                             assign [] <- [] project: []
@@ -318,7 +324,7 @@
                                         -- REPLICATE  |UNPARTITIONED|
                                           exchange
                                           -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                            unnest $$143 <- range(11, 15)
+                                            unnest $$160 <- range(11, 15)
                                             -- UNNEST  |UNPARTITIONED|
                                               empty-tuple-source
                                               -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.16.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.16.plan
index 9e7a0b3..daab513 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.16.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.16.plan
@@ -1,13 +1,13 @@
-distribute result [$$145]
+distribute result [$$166]
 -- DISTRIBUTE_RESULT  |LOCAL|
   exchange
   -- ONE_TO_ONE_EXCHANGE  |LOCAL|
-    assign [$$145] <- [{"g": $$g, "sum_distinct_x": $$146, "sum_y": $$147, "sum_distinct_z": $$148, "avg_distinct_x": $$149, "avg_distinct_y": $$150, "count_x": $$151, "count_distinct_y": $$152, "avg_z": $$153, "count_distinct_z": $$154}] project: [$$145]
+    assign [$$166] <- [{"g": $$g, "sum_distinct_x": $$167, "sum_y": $$168, "sum_distinct_z": $$169, "avg_distinct_x": $$170, "avg_distinct_y": $$171, "count_x": $$172, "count_distinct_y": $$173, "avg_z": $$174, "count_distinct_z": $$175}] project: [$$166]
     -- ASSIGN  |LOCAL|
       exchange
       -- ONE_TO_ONE_EXCHANGE  |LOCAL|
         group by ([$$g := $$g]) decor ([]) {
-                  aggregate [$$146, $$149] <- [agg-sql-sum($$x), agg-sql-avg($$x)]
+                  aggregate [$$167, $$170] <- [agg-sql-sum($$x), agg-sql-avg($$x)]
                   -- AGGREGATE  |LOCAL|
                     distinct ([$$x])
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
@@ -19,15 +19,13 @@
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
                {
-                  aggregate [$$147, $$151, $$153] <- [agg-global-sql-sum($$182), agg-sql-sum($$183), agg-global-sql-avg($$184)]
+                  aggregate [$$168, $$172, $$173, $$174, $$175] <- [agg-sql-sum($$y), agg-sql-count($$x), agg-sql-count-distinct-hash($$y), agg-sql-avg($$z), agg-sql-count-distinct-hash($$z)]
                   -- AGGREGATE  |LOCAL|
-                    aggregate [$$182, $$183, $$184] <- [agg-local-sql-sum($$y), agg-sql-count($$x), agg-local-sql-avg($$z)]
-                    -- AGGREGATE  |LOCAL|
-                      nested tuple source
-                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                    nested tuple source
+                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
                {
-                  aggregate [$$148, $$154] <- [agg-sql-sum($$z), agg-sql-count($$z)]
+                  aggregate [$$169] <- [agg-sql-sum($$z)]
                   -- AGGREGATE  |LOCAL|
                     distinct ([$$z])
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
@@ -39,7 +37,7 @@
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
                {
-                  aggregate [$$150, $$152] <- [agg-sql-avg($$y), agg-sql-count($$y)]
+                  aggregate [$$171] <- [agg-sql-avg($$y)]
                   -- AGGREGATE  |LOCAL|
                     distinct ([$$y])
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.3.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.3.plan
index 2007ceb..26cc6ef 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.3.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.3.plan
@@ -1,46 +1,38 @@
-distribute result [$$47]
+distribute result [$$54]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
   exchange
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    assign [$$47] <- [{"count_distinct_x": $$50}] project: [$$47]
+    assign [$$54] <- [{"count_distinct_x": $$57}] project: [$$54]
     -- ASSIGN  |UNPARTITIONED|
-      aggregate [$$50] <- [agg-sql-count(1)]
+      aggregate [$$57] <- [agg-sql-count-distinct-hash($$52)]
       -- AGGREGATE  |UNPARTITIONED|
         exchange
-        -- SORT_MERGE_EXCHANGE [$$45(ASC) ]  |PARTITIONED|
-          distinct ([$$45])
-          -- PRE_SORTED_DISTINCT_BY  |PARTITIONED|
+        -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+          join (true)
+          -- NESTED_LOOP  |PARTITIONED|
             exchange
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              order (ASC, $$45)
-              -- STABLE_SORT [$$45(ASC)]  |PARTITIONED|
+              assign [$$52] <- [$$x.getField(1)] project: [$$52]
+              -- ASSIGN  |PARTITIONED|
+                project ([$$x])
+                -- STREAM_PROJECT  |PARTITIONED|
+                  exchange
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    data-scan []<-[$$55, $$x] <- test.d1
+                    -- DATASOURCE_SCAN  |PARTITIONED|
+                      exchange
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        empty-tuple-source
+                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+            exchange
+            -- BROADCAST_EXCHANGE  |PARTITIONED|
+              project ([])
+              -- STREAM_PROJECT  |PARTITIONED|
                 exchange
-                -- HASH_PARTITION_EXCHANGE [$$45]  |PARTITIONED|
-                  join (true)
-                  -- NESTED_LOOP  |PARTITIONED|
+                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                  data-scan []<-[$$56, $$y] <- test.d2
+                  -- DATASOURCE_SCAN  |PARTITIONED|
                     exchange
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      assign [$$45] <- [$$x.getField(1)] project: [$$45]
-                      -- ASSIGN  |PARTITIONED|
-                        project ([$$x])
-                        -- STREAM_PROJECT  |PARTITIONED|
-                          exchange
-                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$48, $$x] <- test.d1
-                            -- DATASOURCE_SCAN  |PARTITIONED|
-                              exchange
-                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                empty-tuple-source
-                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                    exchange
-                    -- BROADCAST_EXCHANGE  |PARTITIONED|
-                      project ([])
-                      -- STREAM_PROJECT  |PARTITIONED|
-                        exchange
-                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          data-scan []<-[$$49, $$y] <- test.d2
-                          -- DATASOURCE_SCAN  |PARTITIONED|
-                            exchange
-                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              empty-tuple-source
-                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                      empty-tuple-source
+                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.4.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.4.plan
index 3788451..2ba1dc5 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.4.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.4.plan
@@ -1,46 +1,98 @@
-distribute result [$$56]
+distribute result [$$64]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
   exchange
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    assign [$$56] <- [{"count_distinct_x": $$59, "sum_distinct_x": $$60}] project: [$$56]
+    assign [$$64] <- [{"count_distinct_x": $$67, "sum_distinct_x": $$68}] project: [$$64]
     -- ASSIGN  |UNPARTITIONED|
-      aggregate [$$59, $$60] <- [agg-sql-count($$49), agg-sql-sum($$49)]
-      -- AGGREGATE  |UNPARTITIONED|
-        exchange
-        -- SORT_MERGE_EXCHANGE [$$49(ASC) ]  |PARTITIONED|
-          distinct ([$$49])
-          -- PRE_SORTED_DISTINCT_BY  |PARTITIONED|
-            exchange
-            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              order (ASC, $$49)
-              -- STABLE_SORT [$$49(ASC)]  |PARTITIONED|
-                exchange
-                -- HASH_PARTITION_EXCHANGE [$$49]  |PARTITIONED|
-                  join (true)
-                  -- NESTED_LOOP  |PARTITIONED|
-                    exchange
-                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      assign [$$49] <- [$$x.getField(1)] project: [$$49]
-                      -- ASSIGN  |PARTITIONED|
-                        project ([$$x])
-                        -- STREAM_PROJECT  |PARTITIONED|
+      exchange
+      -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+        join (true)
+        -- NESTED_LOOP  |UNPARTITIONED|
+          exchange
+          -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+            aggregate [$$67] <- [agg-sql-count-distinct-hash($$72)]
+            -- AGGREGATE  |UNPARTITIONED|
+              exchange
+              -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+                assign [$$72] <- [$$57] project: [$$72]
+                -- ASSIGN  |PARTITIONED|
+                  exchange
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    replicate
+                    -- REPLICATE  |PARTITIONED|
+                      exchange
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        join (true)
+                        -- NESTED_LOOP  |PARTITIONED|
                           exchange
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$57, $$x] <- test.d1
-                            -- DATASOURCE_SCAN  |PARTITIONED|
+                            assign [$$57] <- [$$x.getField(1)] project: [$$57]
+                            -- ASSIGN  |PARTITIONED|
+                              project ([$$x])
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                exchange
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  data-scan []<-[$$65, $$x] <- test.d1
+                                  -- DATASOURCE_SCAN  |PARTITIONED|
+                                    exchange
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      empty-tuple-source
+                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                          exchange
+                          -- BROADCAST_EXCHANGE  |PARTITIONED|
+                            project ([])
+                            -- STREAM_PROJECT  |PARTITIONED|
                               exchange
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                empty-tuple-source
-                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                    exchange
-                    -- BROADCAST_EXCHANGE  |PARTITIONED|
-                      project ([])
-                      -- STREAM_PROJECT  |PARTITIONED|
-                        exchange
-                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          data-scan []<-[$$58, $$y] <- test.d2
-                          -- DATASOURCE_SCAN  |PARTITIONED|
-                            exchange
-                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              empty-tuple-source
-                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                data-scan []<-[$$66, $$y] <- test.d2
+                                -- DATASOURCE_SCAN  |PARTITIONED|
+                                  exchange
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    empty-tuple-source
+                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+          exchange
+          -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+            aggregate [$$68] <- [agg-sql-sum($$57)]
+            -- AGGREGATE  |UNPARTITIONED|
+              exchange
+              -- SORT_MERGE_EXCHANGE [$$57(ASC) ]  |PARTITIONED|
+                distinct ([$$57])
+                -- PRE_SORTED_DISTINCT_BY  |PARTITIONED|
+                  exchange
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    order (ASC, $$57)
+                    -- STABLE_SORT [$$57(ASC)]  |PARTITIONED|
+                      exchange
+                      -- HASH_PARTITION_EXCHANGE [$$57]  |PARTITIONED|
+                        replicate
+                        -- REPLICATE  |PARTITIONED|
+                          exchange
+                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                            join (true)
+                            -- NESTED_LOOP  |PARTITIONED|
+                              exchange
+                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                assign [$$57] <- [$$x.getField(1)] project: [$$57]
+                                -- ASSIGN  |PARTITIONED|
+                                  project ([$$x])
+                                  -- STREAM_PROJECT  |PARTITIONED|
+                                    exchange
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      data-scan []<-[$$65, $$x] <- test.d1
+                                      -- DATASOURCE_SCAN  |PARTITIONED|
+                                        exchange
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          empty-tuple-source
+                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                              exchange
+                              -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                project ([])
+                                -- STREAM_PROJECT  |PARTITIONED|
+                                  exchange
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    data-scan []<-[$$66, $$y] <- test.d2
+                                    -- DATASOURCE_SCAN  |PARTITIONED|
+                                      exchange
+                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                        empty-tuple-source
+                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.8.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.8.plan
index 9c9693d..ef06fa6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.8.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.8.plan
@@ -1,8 +1,8 @@
-distribute result [$$131]
+distribute result [$$148]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
   exchange
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    assign [$$131] <- [{"sum_distinct_x": $$135, "sum_y": $$136, "sum_distinct_z": $$137, "avg_distinct_x": $$138, "avg_distinct_y": $$139, "count_x": $$140, "count_distinct_y": $$141, "avg_z": $$142, "count_distinct_z": $$143}] project: [$$131]
+    assign [$$148] <- [{"sum_distinct_x": $$152, "sum_y": $$153, "sum_distinct_z": $$154, "avg_distinct_x": $$155, "avg_distinct_y": $$156, "count_x": $$157, "count_distinct_y": $$158, "avg_z": $$159, "count_distinct_z": $$160}] project: [$$148]
     -- ASSIGN  |UNPARTITIONED|
       exchange
       -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
@@ -18,18 +18,18 @@
                 -- NESTED_LOOP  |UNPARTITIONED|
                   exchange
                   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                    aggregate [$$135, $$138] <- [agg-sql-sum($$156), agg-sql-avg($$156)]
+                    aggregate [$$152, $$155] <- [agg-sql-sum($$173), agg-sql-avg($$173)]
                     -- AGGREGATE  |UNPARTITIONED|
                       exchange
-                      -- SORT_MERGE_EXCHANGE [$$156(ASC) ]  |PARTITIONED|
-                        distinct ([$$156])
+                      -- SORT_MERGE_EXCHANGE [$$173(ASC) ]  |PARTITIONED|
+                        distinct ([$$173])
                         -- PRE_SORTED_DISTINCT_BY  |PARTITIONED|
                           exchange
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            order (ASC, $$156)
-                            -- STABLE_SORT [$$156(ASC)]  |PARTITIONED|
+                            order (ASC, $$173)
+                            -- STABLE_SORT [$$173(ASC)]  |PARTITIONED|
                               exchange
-                              -- HASH_PARTITION_EXCHANGE [$$156]  |PARTITIONED|
+                              -- HASH_PARTITION_EXCHANGE [$$173]  |PARTITIONED|
                                 join (true)
                                 -- NESTED_LOOP  |PARTITIONED|
                                   exchange
@@ -42,9 +42,9 @@
                                         -- REPLICATE  |PARTITIONED|
                                           exchange
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            assign [$$156] <- [$$159.getField(1)] project: [$$156]
+                                            assign [$$173] <- [$$176.getField(1)] project: [$$173]
                                             -- ASSIGN  |PARTITIONED|
-                                              project ([$$159])
+                                              project ([$$176])
                                               -- STREAM_PROJECT  |PARTITIONED|
                                                 exchange
                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -52,7 +52,7 @@
                                                   -- REPLICATE  |PARTITIONED|
                                                     exchange
                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      data-scan []<-[$$160, $$159] <- test.d1
+                                                      data-scan []<-[$$177, $$176] <- test.d1
                                                       -- DATASOURCE_SCAN  |PARTITIONED|
                                                         exchange
                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -64,15 +64,15 @@
                                         -- REPLICATE  |PARTITIONED|
                                           exchange
                                           -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                            assign [$$162, $$161] <- [$$180, $$179] project: []
-                                            -- ASSIGN  |PARTITIONED|
+                                            project ([])
+                                            -- STREAM_PROJECT  |PARTITIONED|
                                               exchange
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                 replicate
                                                 -- REPLICATE  |PARTITIONED|
                                                   exchange
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    data-scan []<-[$$180, $$179] <- test.d2
+                                                    data-scan []<-[$$179, $$178] <- test.d2
                                                     -- DATASOURCE_SCAN  |PARTITIONED|
                                                       exchange
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -84,7 +84,7 @@
                                     -- REPLICATE  |PARTITIONED|
                                       exchange
                                       -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                        assign [$$164, $$163] <- [$$200, $$199] project: []
+                                        assign [$$181, $$180] <- [$$217, $$216] project: []
                                         -- ASSIGN  |PARTITIONED|
                                           exchange
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -92,7 +92,7 @@
                                             -- REPLICATE  |PARTITIONED|
                                               exchange
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                data-scan []<-[$$200, $$199] <- test.d3
+                                                data-scan []<-[$$217, $$216] <- test.d3
                                                 -- DATASOURCE_SCAN  |PARTITIONED|
                                                   exchange
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -100,55 +100,29 @@
                                                     -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                   exchange
                   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                    aggregate [$$136, $$140, $$142] <- [agg-global-sql-sum($$201), agg-sql-sum($$202), agg-global-sql-avg($$203)]
+                    aggregate [$$153, $$157, $$158, $$159, $$160] <- [agg-sql-sum($$192), agg-sql-count($$191), agg-sql-count-distinct-hash($$192), agg-sql-avg($$193), agg-sql-count-distinct-hash($$193)]
                     -- AGGREGATE  |UNPARTITIONED|
                       exchange
                       -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-                        aggregate [$$201, $$202, $$203] <- [agg-local-sql-sum($$175), agg-sql-count($$174), agg-local-sql-avg($$176)]
-                        -- AGGREGATE  |PARTITIONED|
+                        join (true)
+                        -- NESTED_LOOP  |PARTITIONED|
                           exchange
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             join (true)
                             -- NESTED_LOOP  |PARTITIONED|
                               exchange
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                join (true)
-                                -- NESTED_LOOP  |PARTITIONED|
-                                  exchange
-                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                    assign [$$174] <- [$$156] project: [$$174]
-                                    -- ASSIGN  |PARTITIONED|
-                                      exchange
-                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        replicate
-                                        -- REPLICATE  |PARTITIONED|
-                                          exchange
-                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            assign [$$156] <- [$$159.getField(1)] project: [$$156]
-                                            -- ASSIGN  |PARTITIONED|
-                                              project ([$$159])
-                                              -- STREAM_PROJECT  |PARTITIONED|
-                                                exchange
-                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  replicate
-                                                  -- REPLICATE  |PARTITIONED|
-                                                    exchange
-                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      data-scan []<-[$$160, $$159] <- test.d1
-                                                      -- DATASOURCE_SCAN  |PARTITIONED|
-                                                        exchange
-                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                          empty-tuple-source
-                                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                assign [$$191] <- [$$173] project: [$$191]
+                                -- ASSIGN  |PARTITIONED|
                                   exchange
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                     replicate
                                     -- REPLICATE  |PARTITIONED|
                                       exchange
-                                      -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                        assign [$$175] <- [$$179.getField(1)] project: [$$175]
+                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                        assign [$$173] <- [$$176.getField(1)] project: [$$173]
                                         -- ASSIGN  |PARTITIONED|
-                                          project ([$$179])
+                                          project ([$$176])
                                           -- STREAM_PROJECT  |PARTITIONED|
                                             exchange
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -156,7 +130,7 @@
                                               -- REPLICATE  |PARTITIONED|
                                                 exchange
                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  data-scan []<-[$$180, $$179] <- test.d2
+                                                  data-scan []<-[$$177, $$176] <- test.d1
                                                   -- DATASOURCE_SCAN  |PARTITIONED|
                                                     exchange
                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -164,7 +138,7 @@
                                                       -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                               exchange
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                assign [$$176] <- [$$194] project: [$$176]
+                                assign [$$192] <- [$$111] project: [$$192]
                                 -- ASSIGN  |PARTITIONED|
                                   exchange
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -172,36 +146,62 @@
                                     -- REPLICATE  |PARTITIONED|
                                       exchange
                                       -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                        assign [$$194] <- [$$199.getField(1)] project: [$$194]
+                                        assign [$$111] <- [$$y.getField(1)] project: [$$111]
                                         -- ASSIGN  |PARTITIONED|
-                                          project ([$$199])
-                                          -- STREAM_PROJECT  |PARTITIONED|
+                                          assign [$$150, $$y] <- [$$179, $$178] project: [$$y]
+                                          -- ASSIGN  |PARTITIONED|
                                             exchange
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                               replicate
                                               -- REPLICATE  |PARTITIONED|
                                                 exchange
                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  data-scan []<-[$$200, $$199] <- test.d3
+                                                  data-scan []<-[$$179, $$178] <- test.d2
                                                   -- DATASOURCE_SCAN  |PARTITIONED|
                                                     exchange
                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                       empty-tuple-source
                                                       -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                          exchange
+                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                            assign [$$193] <- [$$211] project: [$$193]
+                            -- ASSIGN  |PARTITIONED|
+                              exchange
+                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                replicate
+                                -- REPLICATE  |PARTITIONED|
+                                  exchange
+                                  -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                    assign [$$211] <- [$$216.getField(1)] project: [$$211]
+                                    -- ASSIGN  |PARTITIONED|
+                                      project ([$$216])
+                                      -- STREAM_PROJECT  |PARTITIONED|
+                                        exchange
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          replicate
+                                          -- REPLICATE  |PARTITIONED|
+                                            exchange
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              data-scan []<-[$$217, $$216] <- test.d3
+                                              -- DATASOURCE_SCAN  |PARTITIONED|
+                                                exchange
+                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                  empty-tuple-source
+                                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
               exchange
               -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                aggregate [$$137, $$143] <- [agg-sql-sum($$194), agg-sql-count($$194)]
+                aggregate [$$154] <- [agg-sql-sum($$211)]
                 -- AGGREGATE  |UNPARTITIONED|
                   exchange
-                  -- SORT_MERGE_EXCHANGE [$$194(ASC) ]  |PARTITIONED|
-                    distinct ([$$194])
+                  -- SORT_MERGE_EXCHANGE [$$211(ASC) ]  |PARTITIONED|
+                    distinct ([$$211])
                     -- PRE_SORTED_DISTINCT_BY  |PARTITIONED|
                       exchange
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        order (ASC, $$194)
-                        -- STABLE_SORT [$$194(ASC)]  |PARTITIONED|
+                        order (ASC, $$211)
+                        -- STABLE_SORT [$$211(ASC)]  |PARTITIONED|
                           exchange
-                          -- HASH_PARTITION_EXCHANGE [$$194]  |PARTITIONED|
+                          -- HASH_PARTITION_EXCHANGE [$$211]  |PARTITIONED|
                             join (true)
                             -- NESTED_LOOP  |PARTITIONED|
                               exchange
@@ -214,7 +214,7 @@
                                     -- REPLICATE  |PARTITIONED|
                                       exchange
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        assign [$$196, $$195] <- [$$160, $$159] project: []
+                                        assign [$$213, $$212] <- [$$177, $$176] project: []
                                         -- ASSIGN  |PARTITIONED|
                                           exchange
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -222,7 +222,7 @@
                                             -- REPLICATE  |PARTITIONED|
                                               exchange
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                data-scan []<-[$$160, $$159] <- test.d1
+                                                data-scan []<-[$$177, $$176] <- test.d1
                                                 -- DATASOURCE_SCAN  |PARTITIONED|
                                                   exchange
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -238,15 +238,15 @@
                                         -- REPLICATE  |PARTITIONED|
                                           exchange
                                           -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                            assign [$$162, $$161] <- [$$180, $$179] project: []
-                                            -- ASSIGN  |PARTITIONED|
+                                            project ([])
+                                            -- STREAM_PROJECT  |PARTITIONED|
                                               exchange
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                 replicate
                                                 -- REPLICATE  |PARTITIONED|
                                                   exchange
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    data-scan []<-[$$180, $$179] <- test.d2
+                                                    data-scan []<-[$$179, $$178] <- test.d2
                                                     -- DATASOURCE_SCAN  |PARTITIONED|
                                                       exchange
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -258,9 +258,9 @@
                                 -- REPLICATE  |PARTITIONED|
                                   exchange
                                   -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                    assign [$$194] <- [$$199.getField(1)] project: [$$194]
+                                    assign [$$211] <- [$$216.getField(1)] project: [$$211]
                                     -- ASSIGN  |PARTITIONED|
-                                      project ([$$199])
+                                      project ([$$216])
                                       -- STREAM_PROJECT  |PARTITIONED|
                                         exchange
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -268,7 +268,7 @@
                                           -- REPLICATE  |PARTITIONED|
                                             exchange
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                              data-scan []<-[$$200, $$199] <- test.d3
+                                              data-scan []<-[$$217, $$216] <- test.d3
                                               -- DATASOURCE_SCAN  |PARTITIONED|
                                                 exchange
                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -276,18 +276,18 @@
                                                   -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
           exchange
           -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-            aggregate [$$139, $$141] <- [agg-sql-avg($$94), agg-sql-count($$94)]
+            aggregate [$$156] <- [agg-sql-avg($$111)]
             -- AGGREGATE  |UNPARTITIONED|
               exchange
-              -- SORT_MERGE_EXCHANGE [$$94(ASC) ]  |PARTITIONED|
-                distinct ([$$94])
+              -- SORT_MERGE_EXCHANGE [$$111(ASC) ]  |PARTITIONED|
+                distinct ([$$111])
                 -- PRE_SORTED_DISTINCT_BY  |PARTITIONED|
                   exchange
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    order (ASC, $$94)
-                    -- STABLE_SORT [$$94(ASC)]  |PARTITIONED|
+                    order (ASC, $$111)
+                    -- STABLE_SORT [$$111(ASC)]  |PARTITIONED|
                       exchange
-                      -- HASH_PARTITION_EXCHANGE [$$94]  |PARTITIONED|
+                      -- HASH_PARTITION_EXCHANGE [$$111]  |PARTITIONED|
                         join (true)
                         -- NESTED_LOOP  |PARTITIONED|
                           exchange
@@ -304,7 +304,7 @@
                                     -- REPLICATE  |PARTITIONED|
                                       exchange
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        assign [$$196, $$195] <- [$$160, $$159] project: []
+                                        assign [$$213, $$212] <- [$$177, $$176] project: []
                                         -- ASSIGN  |PARTITIONED|
                                           exchange
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -312,7 +312,7 @@
                                             -- REPLICATE  |PARTITIONED|
                                               exchange
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                data-scan []<-[$$160, $$159] <- test.d1
+                                                data-scan []<-[$$177, $$176] <- test.d1
                                                 -- DATASOURCE_SCAN  |PARTITIONED|
                                                   exchange
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -320,30 +320,26 @@
                                                     -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                               exchange
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                assign [$$94] <- [$$175] project: [$$94]
-                                -- ASSIGN  |PARTITIONED|
+                                replicate
+                                -- REPLICATE  |PARTITIONED|
                                   exchange
-                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                    replicate
-                                    -- REPLICATE  |PARTITIONED|
-                                      exchange
-                                      -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                        assign [$$175] <- [$$179.getField(1)] project: [$$175]
-                                        -- ASSIGN  |PARTITIONED|
-                                          project ([$$179])
-                                          -- STREAM_PROJECT  |PARTITIONED|
+                                  -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                    assign [$$111] <- [$$y.getField(1)] project: [$$111]
+                                    -- ASSIGN  |PARTITIONED|
+                                      assign [$$150, $$y] <- [$$179, $$178] project: [$$y]
+                                      -- ASSIGN  |PARTITIONED|
+                                        exchange
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          replicate
+                                          -- REPLICATE  |PARTITIONED|
                                             exchange
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                              replicate
-                                              -- REPLICATE  |PARTITIONED|
+                                              data-scan []<-[$$179, $$178] <- test.d2
+                                              -- DATASOURCE_SCAN  |PARTITIONED|
                                                 exchange
                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  data-scan []<-[$$180, $$179] <- test.d2
-                                                  -- DATASOURCE_SCAN  |PARTITIONED|
-                                                    exchange
-                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      empty-tuple-source
-                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                  empty-tuple-source
+                                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                           exchange
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             assign [] <- [] project: []
@@ -354,7 +350,7 @@
                                 -- REPLICATE  |PARTITIONED|
                                   exchange
                                   -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                    assign [$$164, $$163] <- [$$200, $$199] project: []
+                                    assign [$$181, $$180] <- [$$217, $$216] project: []
                                     -- ASSIGN  |PARTITIONED|
                                       exchange
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -362,7 +358,7 @@
                                         -- REPLICATE  |PARTITIONED|
                                           exchange
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            data-scan []<-[$$200, $$199] <- test.d3
+                                            data-scan []<-[$$217, $$216] <- test.d3
                                             -- DATASOURCE_SCAN  |PARTITIONED|
                                               exchange
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.10.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.10.plan
index 6d59cf8..92c059b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.10.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.10.plan
@@ -1,19 +1,25 @@
-distribute result [$$89]
+distribute result [$$91]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    assign [$$89] <- [{"g": $$g, "count_distinct_x": $$92, "sum_distinct_x": $$93}] project: [$$89]
+    assign [$$91] <- [{"g": $$g, "count_distinct_x": $$94, "sum_distinct_x": $$95}] project: [$$91]
     -- ASSIGN  |PARTITIONED|
       exchange
       -- SORT_MERGE_EXCHANGE [$$g(ASC) ]  |PARTITIONED|
         group by ([$$g := $$g]) decor ([]) {
-                  aggregate [$$92, $$93] <- [agg-sql-count($$82), agg-sql-sum($$82)]
+                  aggregate [$$94] <- [agg-sql-count-distinct-hash($$84)]
                   -- AGGREGATE  |LOCAL|
-                    distinct ([$$82])
+                    nested tuple source
+                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+               }
+               {
+                  aggregate [$$95] <- [agg-sql-sum($$84)]
+                  -- AGGREGATE  |LOCAL|
+                    distinct ([$$84])
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
-                      order (ASC, $$82)
-                      -- MICRO_STABLE_SORT [$$82(ASC)]  |LOCAL|
-                        project ([$$82])
+                      order (ASC, $$84)
+                      -- MICRO_STABLE_SORT [$$84(ASC)]  |LOCAL|
+                        project ([$$84])
                         -- STREAM_PROJECT  |LOCAL|
                           nested tuple source
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
@@ -33,13 +39,13 @@
                     -- NESTED_LOOP  |PARTITIONED|
                       exchange
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        assign [$$82] <- [$$x.getField(1)] project: [$$82]
+                        assign [$$84] <- [$$x.getField(1)] project: [$$84]
                         -- ASSIGN  |PARTITIONED|
                           project ([$$x])
                           -- STREAM_PROJECT  |PARTITIONED|
                             exchange
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              data-scan []<-[$$90, $$x] <- test.d1
+                              data-scan []<-[$$92, $$x] <- test.d1
                               -- DATASOURCE_SCAN  |PARTITIONED|
                                 exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -51,7 +57,7 @@
                         -- STREAM_PROJECT  |PARTITIONED|
                           exchange
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$91, $$y] <- test.d2
+                            data-scan []<-[$$93, $$y] <- test.d2
                             -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.14.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.14.plan
index 21e98f4..32d92d2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.14.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.14.plan
@@ -1,49 +1,49 @@
-distribute result [$$166]
+distribute result [$$175]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    assign [$$166] <- [{"g": $$g, "sum_distinct_x": $$170, "sum_y": $$171, "sum_distinct_z": $$172, "avg_distinct_x": $$173, "avg_distinct_y": $$174, "count_x": $$175, "count_distinct_y": $$176, "avg_z": $$177, "count_distinct_z": $$178}] project: [$$166]
+    assign [$$175] <- [{"g": $$g, "sum_distinct_x": $$179, "sum_y": $$180, "sum_distinct_z": $$181, "avg_distinct_x": $$182, "avg_distinct_y": $$183, "count_x": $$184, "count_distinct_y": $$185, "avg_z": $$186, "count_distinct_z": $$187}] project: [$$175]
     -- ASSIGN  |PARTITIONED|
       exchange
       -- SORT_MERGE_EXCHANGE [$$g(ASC) ]  |PARTITIONED|
         group by ([$$g := $$g]) decor ([]) {
-                  aggregate [$$170, $$173] <- [agg-sql-sum($$124), agg-sql-avg($$124)]
+                  aggregate [$$179, $$182] <- [agg-sql-sum($$133), agg-sql-avg($$133)]
                   -- AGGREGATE  |LOCAL|
-                    distinct ([$$124])
+                    distinct ([$$133])
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
-                      order (ASC, $$124)
-                      -- MICRO_STABLE_SORT [$$124(ASC)]  |LOCAL|
-                        project ([$$124])
+                      order (ASC, $$133)
+                      -- MICRO_STABLE_SORT [$$133(ASC)]  |LOCAL|
+                        project ([$$133])
                         -- STREAM_PROJECT  |LOCAL|
                           nested tuple source
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
                {
-                  aggregate [$$171, $$175, $$177] <- [agg-sql-sum($$129), agg-sql-count($$124), agg-sql-avg($$134)]
+                  aggregate [$$180, $$184, $$185, $$186, $$187] <- [agg-sql-sum($$138), agg-sql-count($$133), agg-sql-count-distinct-hash($$138), agg-sql-avg($$143), agg-sql-count-distinct-hash($$143)]
                   -- AGGREGATE  |LOCAL|
                     nested tuple source
                     -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
                {
-                  aggregate [$$172, $$178] <- [agg-sql-sum($$134), agg-sql-count($$134)]
+                  aggregate [$$181] <- [agg-sql-sum($$143)]
                   -- AGGREGATE  |LOCAL|
-                    distinct ([$$134])
+                    distinct ([$$143])
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
-                      order (ASC, $$134)
-                      -- MICRO_STABLE_SORT [$$134(ASC)]  |LOCAL|
-                        project ([$$134])
+                      order (ASC, $$143)
+                      -- MICRO_STABLE_SORT [$$143(ASC)]  |LOCAL|
+                        project ([$$143])
                         -- STREAM_PROJECT  |LOCAL|
                           nested tuple source
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
                {
-                  aggregate [$$174, $$176] <- [agg-sql-avg($$129), agg-sql-count($$129)]
+                  aggregate [$$183] <- [agg-sql-avg($$138)]
                   -- AGGREGATE  |LOCAL|
-                    distinct ([$$129])
+                    distinct ([$$138])
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
-                      order (ASC, $$129)
-                      -- MICRO_STABLE_SORT [$$129(ASC)]  |LOCAL|
-                        project ([$$129])
+                      order (ASC, $$138)
+                      -- MICRO_STABLE_SORT [$$138(ASC)]  |LOCAL|
+                        project ([$$138])
                         -- STREAM_PROJECT  |LOCAL|
                           nested tuple source
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
@@ -67,13 +67,13 @@
                         -- NESTED_LOOP  |PARTITIONED|
                           exchange
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            assign [$$124] <- [$$x.getField(1)] project: [$$124]
+                            assign [$$133] <- [$$x.getField(1)] project: [$$133]
                             -- ASSIGN  |PARTITIONED|
                               project ([$$x])
                               -- STREAM_PROJECT  |PARTITIONED|
                                 exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  data-scan []<-[$$167, $$x] <- test.d1
+                                  data-scan []<-[$$176, $$x] <- test.d1
                                   -- DATASOURCE_SCAN  |PARTITIONED|
                                     exchange
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -81,13 +81,13 @@
                                       -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                           exchange
                           -- BROADCAST_EXCHANGE  |PARTITIONED|
-                            assign [$$129] <- [$$y.getField(1)] project: [$$129]
+                            assign [$$138] <- [$$y.getField(1)] project: [$$138]
                             -- ASSIGN  |PARTITIONED|
                               project ([$$y])
                               -- STREAM_PROJECT  |PARTITIONED|
                                 exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  data-scan []<-[$$168, $$y] <- test.d2
+                                  data-scan []<-[$$177, $$y] <- test.d2
                                   -- DATASOURCE_SCAN  |PARTITIONED|
                                     exchange
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -95,13 +95,13 @@
                                       -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                       exchange
                       -- BROADCAST_EXCHANGE  |PARTITIONED|
-                        assign [$$134] <- [$$z.getField(1)] project: [$$134]
+                        assign [$$143] <- [$$z.getField(1)] project: [$$143]
                         -- ASSIGN  |PARTITIONED|
                           project ([$$z])
                           -- STREAM_PROJECT  |PARTITIONED|
                             exchange
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              data-scan []<-[$$169, $$z] <- test.d3
+                              data-scan []<-[$$178, $$z] <- test.d3
                               -- DATASOURCE_SCAN  |PARTITIONED|
                                 exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.9.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.9.plan
index 8b4c223..525f016 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.9.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.9.plan
@@ -1,22 +1,16 @@
-distribute result [$$80]
+distribute result [$$81]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    assign [$$80] <- [{"g": $$g, "count_distinct_x": $$83}] project: [$$80]
+    assign [$$81] <- [{"g": $$g, "count_distinct_x": $$84}] project: [$$81]
     -- ASSIGN  |PARTITIONED|
       exchange
       -- SORT_MERGE_EXCHANGE [$$g(ASC) ]  |PARTITIONED|
         group by ([$$g := $$g]) decor ([]) {
-                  aggregate [$$83] <- [agg-sql-count($$78)]
+                  aggregate [$$84] <- [agg-sql-count-distinct-hash($$79)]
                   -- AGGREGATE  |LOCAL|
-                    distinct ([$$78])
-                    -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
-                      order (ASC, $$78)
-                      -- MICRO_STABLE_SORT [$$78(ASC)]  |LOCAL|
-                        project ([$$78])
-                        -- STREAM_PROJECT  |LOCAL|
-                          nested tuple source
-                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                    nested tuple source
+                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$g]  |PARTITIONED|
           exchange
@@ -33,13 +27,13 @@
                     -- NESTED_LOOP  |PARTITIONED|
                       exchange
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        assign [$$78] <- [$$x.getField(1)] project: [$$78]
+                        assign [$$79] <- [$$x.getField(1)] project: [$$79]
                         -- ASSIGN  |PARTITIONED|
                           project ([$$x])
                           -- STREAM_PROJECT  |PARTITIONED|
                             exchange
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              data-scan []<-[$$81, $$x] <- test.d1
+                              data-scan []<-[$$82, $$x] <- test.d1
                               -- DATASOURCE_SCAN  |PARTITIONED|
                                 exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -51,7 +45,7 @@
                         -- STREAM_PROJECT  |PARTITIONED|
                           exchange
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$82, $$y] <- test.d2
+                            data-scan []<-[$$83, $$y] <- test.d2
                             -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/cbo-join/computed-join-predicate.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/cbo-join/computed-join-predicate.plan
index 0ec68db..1212e73 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/cbo-join/computed-join-predicate.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/cbo-join/computed-join-predicate.plan
@@ -11,34 +11,10 @@
           exchange [cardinality: 0.0, doc-size: -5.0, op-cost: 0.0, total-cost: 0.0]
           -- RANGE_PARTITION_EXCHANGE [$$200(DESC), $$r_name(ASC), $$su_nationkey(ASC)] RANGE_MAP:{SPLIT:1}  |PARTITIONED|
             group by ([$$r_name := $$189; $$su_nationkey := $$192]) decor ([]) {
-                      aggregate [$$200] <- [agg-sql-sum($$175)] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                      aggregate [$$200, $$201, $$202] <- [agg-sql-sum($$175), agg-sql-count-distinct-hash($$191), agg-sql-count-distinct-hash($$186)] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- AGGREGATE  |LOCAL|
                         nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- NESTED_TUPLE_SOURCE  |LOCAL|
-                   }
-                   {
-                      aggregate [$$201] <- [agg-sql-count($$191)] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                      -- AGGREGATE  |LOCAL|
-                        distinct ([$$191]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                        -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
-                          order (ASC, $$191) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                          -- MICRO_STABLE_SORT [$$191(ASC)]  |LOCAL|
-                            project ([$$191]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                            -- STREAM_PROJECT  |LOCAL|
-                              nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
-                   }
-                   {
-                      aggregate [$$202] <- [agg-sql-count($$186)] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                      -- AGGREGATE  |LOCAL|
-                        distinct ([$$186]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                        -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
-                          order (ASC, $$186) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                          -- MICRO_STABLE_SORT [$$186(ASC)]  |LOCAL|
-                            project ([$$186]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                            -- STREAM_PROJECT  |LOCAL|
-                              nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                    } [cardinality: 0.0, doc-size: -5.0, op-cost: 0.0, total-cost: 0.0]
             -- PRE_CLUSTERED_GROUP_BY[$$189, $$192]  |PARTITIONED|
               exchange [cardinality: 0.0, doc-size: -5.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q16.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q16.plan
index f727f57..19a8d5b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q16.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q16.plan
@@ -1,43 +1,35 @@
-distribute result [$$149] [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 1.500015E12]
+distribute result [$$149] [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 6.2500500004499976E16]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 1.500015E12]
+  exchange [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 6.2500500004499976E16]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    assign [$$149] <- [{"i_name": $$i_name, "brand": $#1, "i_price": $$i_price, "supplier_cnt": $$160}] project: [$$149] [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 1.500015E12]
+    assign [$$149] <- [{"i_name": $$i_name, "brand": $#1, "i_price": $$i_price, "supplier_cnt": $$160}] project: [$$149] [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 6.2500500004499976E16]
     -- ASSIGN  |PARTITIONED|
-      exchange [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 1.500015E12]
+      exchange [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 6.2500500004499976E16]
       -- SORT_MERGE_EXCHANGE [$$160(DESC) ]  |PARTITIONED|
-        order (DESC, $$160) [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 1.500015E12]
+        order (DESC, $$160) [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 6.2500500004499976E16]
         -- STABLE_SORT [$$160(DESC)]  |PARTITIONED|
-          exchange [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 1.500015E12]
+          exchange [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 6.2500500004499976E16]
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
             group by ([$$i_name := $$150; $#1 := $$151; $$i_price := $$152]) decor ([]) {
-                      aggregate [$$160] <- [agg-sql-count($$171)] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                      aggregate [$$160] <- [agg-sql-count-distinct-hash(numeric-mod(numeric-multiply($$164, $$165), 10000))] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- AGGREGATE  |LOCAL|
-                        distinct ([$$171]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                        -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
-                          order (ASC, $$171) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                          -- MICRO_STABLE_SORT [$$171(ASC)]  |LOCAL|
-                            assign [$$171] <- [numeric-mod(numeric-multiply($$164, $$165), 10000)] project: [$$171] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                            -- ASSIGN  |LOCAL|
-                              project ([$$164, $$165]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                              -- STREAM_PROJECT  |LOCAL|
-                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
-                   } [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 1.500015E12]
+                        nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                   } [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 6.2500500004499976E16]
             -- PRE_CLUSTERED_GROUP_BY[$$150, $$151, $$152]  |PARTITIONED|
-              exchange [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 1.500015E12]
+              exchange [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 6.2500500004499976E16]
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                order (ASC, $$150) (ASC, $$151) (ASC, $$152) [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 1.500015E12]
+                order (ASC, $$150) (ASC, $$151) (ASC, $$152) [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 6.2500500004499976E16]
                 -- STABLE_SORT [$$150(ASC), $$151(ASC), $$152(ASC)]  |PARTITIONED|
-                  exchange [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 1.500015E12]
+                  exchange [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 6.2500500004499976E16]
                   -- HASH_PARTITION_EXCHANGE [$$150, $$151, $$152]  |PARTITIONED|
-                    assign [$$151] <- [substring1($$153, 1, 3)] project: [$$164, $$165, $$150, $$151, $$152] [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 1.500015E12]
+                    assign [$$151] <- [substring1($$153, 1, 3)] project: [$$164, $$165, $$150, $$151, $$152] [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 6.2500500004499976E16]
                     -- ASSIGN  |PARTITIONED|
-                      select ($$132) project: [$$150, $$152, $$153, $$165, $$164] [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 1.500015E12]
+                      select ($$132) project: [$$150, $$152, $$153, $$165, $$164] [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 6.2500500004499976E16]
                       -- STREAM_SELECT  |PARTITIONED|
-                        project ([$$132, $$150, $$152, $$153, $$165, $$164]) [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 1.500015E12]
+                        project ([$$132, $$150, $$152, $$153, $$165, $$164]) [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 6.2500500004499976E16]
                         -- STREAM_PROJECT  |PARTITIONED|
-                          exchange [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 1.500015E12]
+                          exchange [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 6.2500500004499976E16]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             group by ([$$167 := $$154; $$168 := $$155]) decor ([$$150; $$152; $$153; $$165 := $$159; $$164 := $$162]) {
                                       aggregate [$$132] <- [empty-stream()] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
@@ -48,35 +40,35 @@
                                           -- STREAM_PROJECT  |LOCAL|
                                             nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                             -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                   } [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 1.500015E12]
+                                   } [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 6.2500500004499976E16]
                             -- PRE_CLUSTERED_GROUP_BY[$$154, $$155]  |PARTITIONED|
-                              exchange [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 1.500015E12]
+                              exchange [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 6.2500500004499976E16]
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                order (ASC, $$154) (ASC, $$155) [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 1.500015E12]
+                                order (ASC, $$154) (ASC, $$155) [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 6.2500500004499976E16]
                                 -- STABLE_SORT [$$154(ASC), $$155(ASC)]  |PARTITIONED|
-                                  exchange [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 1.500015E12]
+                                  exchange [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 6.2500500004499976E16]
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                    project ([$$150, $$152, $$153, $$166, $$154, $$155, $$159, $$162]) [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 1.500015E12]
+                                    project ([$$150, $$152, $$153, $$166, $$154, $$155, $$159, $$162]) [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 6.2500500004499976E16]
                                     -- STREAM_PROJECT  |PARTITIONED|
-                                      exchange [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 1.500015E12]
+                                      exchange [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 0.0, total-cost: 6.2500500004499976E16]
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        join (eq($$158, $$159)) [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 5.00004E11, total-cost: 1.500015E12]
+                                        join (eq($$158, $$159)) [cardinality: 9.223372036854776E16, doc-size: -3.0, op-cost: 6.2500125001E16, total-cost: 6.2500500004499976E16]
                                         -- HYBRID_HASH_JOIN [$$159][$$158]  |PARTITIONED|
-                                          exchange [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 1000000.0]
+                                          exchange [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 499992.37]
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            project ([$$166, $$154, $$159, $$162]) [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 1000000.0]
+                                            project ([$$166, $$154, $$159, $$162]) [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 499992.37]
                                             -- STREAM_PROJECT  |PARTITIONED|
-                                              exchange [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 1000000.0]
+                                              exchange [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 499992.37]
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                left outer join (not(if-missing-or-null(neq(numeric-mod(numeric-multiply($$162, $$159), 10000), $$126), false))) [cardinality: 5.0E11, doc-size: -2.0, op-cost: 1.0E12, total-cost: 1.000006E12]
+                                                left outer join (not(if-missing-or-null(neq(numeric-mod(numeric-multiply($$162, $$159), 10000), $$126), false))) [cardinality: 5.0E11, doc-size: -2.0, op-cost: 3.75E11, total-cost: 3.7500199998474E11]
                                                 -- NESTED_LOOP  |PARTITIONED|
-                                                  exchange [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                  exchange [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 499992.37]
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    assign [$$159, $$162] <- [$$s.getField("s_i_id"), $$s.getField("s_w_id")] project: [$$154, $$159, $$162] [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                    assign [$$159, $$162] <- [$$s.getField("s_i_id"), $$s.getField("s_w_id")] project: [$$154, $$159, $$162] [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 499992.37]
                                                     -- ASSIGN  |PARTITIONED|
-                                                      exchange [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                      exchange [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 499992.37]
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                        data-scan []<-[$$154, $$s] <- test.stock [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                        data-scan []<-[$$154, $$s] <- test.stock [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 499992.37]
                                                         -- DATASOURCE_SCAN  |PARTITIONED|
                                                           exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -86,7 +78,7 @@
                                                   -- BROADCAST_EXCHANGE  |PARTITIONED|
                                                     assign [$$166] <- [true] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                     -- ASSIGN  |PARTITIONED|
-                                                      select (like($$su.getField("su_comment"), "%Customer%Complaints%")) project: [$$126] [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                      select (like($$su.getField("su_comment"), "%Customer%Complaints%")) project: [$$126] [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 499992.37]
                                                       -- STREAM_SELECT  |PARTITIONED|
                                                         assign [$$126] <- [$$su.getField("su_suppkey")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                         -- ASSIGN  |PARTITIONED|
@@ -94,21 +86,21 @@
                                                           -- STREAM_PROJECT  |PARTITIONED|
                                                             exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                              data-scan []<-[$$156, $$su] <- test.supplier [cardinality: 1000000.0, doc-size: -1.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                              data-scan []<-[$$156, $$su] <- test.supplier [cardinality: 1000000.0, doc-size: -1.0, op-cost: 499992.37, total-cost: 499992.37]
                                                               -- DATASOURCE_SCAN  |PARTITIONED|
                                                                 exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                   empty-tuple-source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                                   -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                          exchange [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 1000000.0]
+                                          exchange [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 499992.37]
                                           -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                            select (not(and(ge($$153, "zz"), lt($$153, "z{")))) [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 1000000.0]
+                                            select (not(and(ge($$153, "zz"), lt($$153, "z{")))) [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 499992.37]
                                             -- STREAM_SELECT  |PARTITIONED|
-                                              assign [$$152, $$150, $$153, $$158] <- [$$i.getField("i_price"), $$i.getField("i_name"), $$i.getField("i_data"), $$i.getField("i_id")] project: [$$155, $$152, $$150, $$153, $$158] [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 1000000.0]
+                                              assign [$$152, $$150, $$153, $$158] <- [$$i.getField("i_price"), $$i.getField("i_name"), $$i.getField("i_data"), $$i.getField("i_id")] project: [$$155, $$152, $$150, $$153, $$158] [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 499992.37]
                                               -- ASSIGN  |PARTITIONED|
-                                                exchange [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                exchange [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 499992.37]
                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  data-scan []<-[$$155, $$i] <- test.item [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                  data-scan []<-[$$155, $$i] <- test.item [cardinality: 1000000.0, doc-size: -1.0, op-cost: 0.0, total-cost: 499992.37]
                                                   -- DATASOURCE_SCAN  |PARTITIONED|
                                                     exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1/cluster_state_1.1.regexadm b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1/cluster_state_1.1.regexadm
index 3f0ec8e..e4ef2d5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1/cluster_state_1.1.regexadm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1/cluster_state_1.1.regexadm
@@ -48,7 +48,7 @@
     "cloud.storage.scheme" : "",
     "cloud.storage.sweep.threshold.percentage" : 0.9,
     "cloud.write.buffer.size" : 8388608,
-    "compiler.aggregate.distinct.hash" : false,
+    "compiler.aggregate.distinct.hash" : true,
     "compiler.aggregate.distinct.hash.memory" : 33554432,
     "compiler\.arrayindex" : true,
     "compiler.batch.lookup" : true,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_full/cluster_state_1_full.1.regexadm b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_full/cluster_state_1_full.1.regexadm
index 07aea4d..4c5abb5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_full/cluster_state_1_full.1.regexadm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_full/cluster_state_1_full.1.regexadm
@@ -48,7 +48,7 @@
     "cloud.storage.scheme" : "",
     "cloud.storage.sweep.threshold.percentage" : 0.9,
     "cloud.write.buffer.size" : 8388608,
-    "compiler.aggregate.distinct.hash" : false,
+    "compiler.aggregate.distinct.hash" : true,
     "compiler.aggregate.distinct.hash.memory" : 33554432,
     "compiler\.arrayindex" : true,
     "compiler.batch.lookup" : true,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_less/cluster_state_1_less.1.regexadm b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_less/cluster_state_1_less.1.regexadm
index cdb4832..9ef0ac3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_less/cluster_state_1_less.1.regexadm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_less/cluster_state_1_less.1.regexadm
@@ -48,7 +48,7 @@
     "cloud.storage.scheme" : "",
     "cloud.storage.sweep.threshold.percentage" : 0.9,
     "cloud.write.buffer.size" : 8388608,
-    "compiler.aggregate.distinct.hash" : false,
+    "compiler.aggregate.distinct.hash" : true,
     "compiler.aggregate.distinct.hash.memory" : 33554432,
     "compiler\.arrayindex" : true,
     "compiler.batch.lookup" : true,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.020.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.020.plan
index f9e72f4..64b781e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.020.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.020.plan
@@ -1,47 +1,39 @@
-distribute result [$$66] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+distribute result [$$75] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
   exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    assign [$$66] <- [{"count": $$69}] project: [$$66] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+    assign [$$75] <- [{"count": $$78}] project: [$$75] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
     -- ASSIGN  |UNPARTITIONED|
-      aggregate [$$69] <- [agg-sql-count(1)] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+      aggregate [$$78] <- [agg-sql-count-distinct-hash($$73)] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
       -- AGGREGATE  |UNPARTITIONED|
         exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-        -- SORT_MERGE_EXCHANGE [$$64(ASC) ]  |PARTITIONED|
-          distinct ([$$64]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-          -- PRE_SORTED_DISTINCT_BY  |PARTITIONED|
-            exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              order (ASC, $$64) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-              -- STABLE_SORT [$$64(ASC)]  |PARTITIONED|
-                exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                -- HASH_PARTITION_EXCHANGE [$$64]  |PARTITIONED|
-                  select (ge($$68, 3)) project: [$$64] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                  -- STREAM_SELECT  |PARTITIONED|
-                    project ([$$64, $$68]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                    -- STREAM_PROJECT  |PARTITIONED|
-                      subplan {
-                                aggregate [$$68] <- [agg-sql-sum($$52)] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                -- AGGREGATE  |LOCAL|
-                                  assign [$$52] <- [$$i.getField("count")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                  -- ASSIGN  |LOCAL|
-                                    unnest $$i <- scan-collection($$70) project: [$$i] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                    -- UNNEST  |LOCAL|
-                                      project ([$$70]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                      -- STREAM_PROJECT  |LOCAL|
-                                        nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
-                             } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                      -- SUBPLAN  |PARTITIONED|
-                        assign [$$64, $$70] <- [to-object-var-str($$t).getField(0), $$t.getField("a1")] project: [$$64, $$70] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                        -- ASSIGN  |PARTITIONED|
-                          project ([$$t]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                          -- STREAM_PROJECT  |PARTITIONED|
-                            exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              data-scan []<-[$$67, $$t] <- test.ColumnDataset [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                              -- DATASOURCE_SCAN  |PARTITIONED|
-                                exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  empty-tuple-source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+        -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+          select (ge($$77, 3)) project: [$$73] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+          -- STREAM_SELECT  |PARTITIONED|
+            project ([$$73, $$77]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+            -- STREAM_PROJECT  |PARTITIONED|
+              subplan {
+                        aggregate [$$77] <- [agg-sql-sum($$61)] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                        -- AGGREGATE  |LOCAL|
+                          assign [$$61] <- [$$i.getField("count")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                          -- ASSIGN  |LOCAL|
+                            unnest $$i <- scan-collection($$79) project: [$$i] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                            -- UNNEST  |LOCAL|
+                              project ([$$79]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                     } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+              -- SUBPLAN  |PARTITIONED|
+                assign [$$73, $$79] <- [to-object-var-str($$t).getField(0), $$t.getField("a1")] project: [$$73, $$79] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                -- ASSIGN  |PARTITIONED|
+                  project ([$$t]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                  -- STREAM_PROJECT  |PARTITIONED|
+                    exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      data-scan []<-[$$76, $$t] <- test.ColumnDataset [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                      -- DATASOURCE_SCAN  |PARTITIONED|
+                        exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          empty-tuple-source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/config/AlgebricksConfig.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/config/AlgebricksConfig.java
index e7813b2..9b3cbb0 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/config/AlgebricksConfig.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/config/AlgebricksConfig.java
@@ -39,7 +39,7 @@
     public static final boolean CBO_TEST_DEFAULT = false;
     public static final boolean FORCE_JOIN_ORDER_DEFAULT = false;
     public static final boolean REWRITE_DISJUNCTION_DEFAULT = false;
-    public static final boolean AGGREGATE_DISTINCT_HASH_DEFAULT = false;
+    public static final boolean AGGREGATE_DISTINCT_HASH_DEFAULT = true;
     public static final String QUERY_PLAN_SHAPE_ZIGZAG = "zigzag";
     public static final String QUERY_PLAN_SHAPE_LEFTDEEP = "leftdeep";
     public static final String QUERY_PLAN_SHAPE_RIGHTDEEP = "rightdeep";

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/21739?usp=email
To unsubscribe, or for help writing mail filters, visit https://asterix-gerrit.ics.uci.edu/settings?usp=email

Gerrit-MessageType: newchange
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Change-Id: I3abfe8c99e68959a20c1b0a7022b698dec75db30
Gerrit-Change-Number: 21739
Gerrit-PatchSet: 1
Gerrit-Owner: Shahrzad Shirazi <sh...@ucr.edu>