This is an automated email from the ASF dual-hosted git repository. avamingli pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/cloudberry.git
commit 0e3389c609f5933fd66225fac5553d251741f86a Author: Zhang Mingli <[email protected]> AuthorDate: Mon Oct 27 21:26:01 2025 +0800 Switch to Streaming HashAgg for multiple phase aggregation. This commit changes the Postgres planner to use Streaming HashAgg for multi-phase aggregation plans, matching Orca's approach. While non-streaming aggregation may spill to disk when data per segment is largely unique, streaming incurs minimal overhead and proves beneficial overall based on empirical evidence. Authored-by: Zhang Mingli [email protected] --- src/backend/cdb/cdbgroupingpaths.c | 2 +- src/test/regress/expected/agg_pushdown.out | 2 +- src/test/regress/expected/aggregates.out | 14 +++++++------- src/test/regress/expected/aqumv.out | 20 ++++++++++---------- src/test/regress/expected/bfv_aggregate.out | 6 +++--- src/test/regress/expected/cbdb_parallel.out | 8 ++++---- src/test/regress/expected/cte_prune.out | 6 +++--- src/test/regress/expected/direct_dispatch.out | 2 +- src/test/regress/expected/eagerfree.out | 8 ++++---- src/test/regress/expected/gp_aggregates_costs.out | 6 +++--- src/test/regress/expected/gp_distinct_plans.out | 2 +- src/test/regress/expected/gp_dqa.out | 2 +- src/test/regress/expected/gp_hashagg.out | 8 ++++---- src/test/regress/expected/gpctas.out | 6 +++--- src/test/regress/expected/gporca.out | 6 +++--- src/test/regress/expected/indexjoin.out | 2 +- src/test/regress/expected/limit_gp.out | 4 ++-- src/test/regress/expected/olap_plans.out | 6 +++--- src/test/regress/expected/partition_aggregate.out | 6 +++--- src/test/regress/expected/partition_join.out | 2 +- src/test/regress/expected/qp_misc_jiras.out | 2 +- src/test/regress/expected/select_distinct.out | 2 +- src/test/regress/expected/shared_scan.out | 4 ++-- src/test/regress/expected/subselect.out | 2 +- src/test/regress/expected/window.out | 2 +- src/test/regress/expected/write_parallel.out | 8 ++++---- 26 files changed, 69 insertions(+), 69 deletions(-) diff --git a/src/backend/cdb/cdbgroupingpaths.c b/src/backend/cdb/cdbgroupingpaths.c index 7ed1fec34b9..4fff89b19dc 100644 --- a/src/backend/cdb/cdbgroupingpaths.c +++ b/src/backend/cdb/cdbgroupingpaths.c @@ -1264,7 +1264,7 @@ add_first_stage_hash_agg_path(PlannerInfo *root, ctx->partial_grouping_target, AGG_HASHED, ctx->hasAggs ? AGGSPLIT_INITIAL_SERIAL : AGGSPLIT_SIMPLE, - false, /* streaming */ + true, /* streaming */ ctx->groupClause, NIL, ctx->agg_partial_costs, diff --git a/src/test/regress/expected/agg_pushdown.out b/src/test/regress/expected/agg_pushdown.out index 2895c8e69a8..9ed0c09f782 100644 --- a/src/test/regress/expected/agg_pushdown.out +++ b/src/test/regress/expected/agg_pushdown.out @@ -204,7 +204,7 @@ AS c1 ON c1.parent = p.x GROUP BY p.i; -> Redistribute Motion 3:3 (slice2; segments: 3) Output: p.i, (PARTIAL avg(c1.v)) Hash Key: p.i - -> Partial HashAggregate + -> Streaming Partial HashAggregate Output: p.i, PARTIAL avg(c1.v) Group Key: p.i -> Hash Join diff --git a/src/test/regress/expected/aggregates.out b/src/test/regress/expected/aggregates.out index e2105a3af40..51e113ef8b6 100644 --- a/src/test/regress/expected/aggregates.out +++ b/src/test/regress/expected/aggregates.out @@ -1315,7 +1315,7 @@ explain (costs off) select a,c from t1 group by a,c,d; Group Key: a, c, d -> Redistribute Motion 3:3 (slice2; segments: 3) Hash Key: a, c, d - -> HashAggregate + -> Streaming HashAggregate Group Key: a, c, d -> Seq Scan on t1 Optimizer: Postgres query optimizer @@ -3317,7 +3317,7 @@ having sum(tgb1.v3 * tgb2.v3) > 100 and AggRefs(TargetList): [(0, 0)] -> Redistribute Motion 3:3 (slice2; segments: 3) (cost=145944.41..145974.41 rows=1000 width=84) Hash Key: tgb2.v2 - -> Partial HashAggregate (cost=145944.41..145954.41 rows=1000 width=84) + -> Streaming Partial HashAggregate (cost=145944.41..145954.41 rows=1000 width=84) Group Key: tgb2.v2 AggRefs(TargetList): [(0, 0), (1, 1), (2, 2), (3, 3)] -> Hash Join (cost=618.25..105488.34 rows=2022803 width=20) @@ -3372,7 +3372,7 @@ having sum(tgb1.v3 * tgb2.v3) > 100 and AggRefs(TargetList): [(0, 0)] -> Redistribute Motion 3:3 (slice2; segments: 3) (cost=145944.41..145974.41 rows=1000 width=84) Hash Key: tgb2.v2 - -> Partial HashAggregate (cost=145944.41..145954.41 rows=1000 width=84) + -> Streaming Partial HashAggregate (cost=145944.41..145954.41 rows=1000 width=84) Group Key: tgb2.v2 AggRefs(TargetList): [(0, 0), (1, 1), (2, 2), (3, 3)] -> Hash Join (cost=618.25..105488.34 rows=2022803 width=20) @@ -3417,7 +3417,7 @@ explain (costs off) select v2,v3 from pds_t1 group by v2,v3; Group Key: v2, v3 -> Redistribute Motion 3:3 (slice2; segments: 3) Hash Key: v2, v3 - -> HashAggregate + -> Streaming HashAggregate Group Key: v2, v3 -> Seq Scan on pds_t1 Optimizer: Postgres query optimizer @@ -3432,7 +3432,7 @@ explain (costs off) select v2,v3 from pds_t1 group by v2,v3; Group Key: v2, v3 -> Redistribute Motion 3:3 (slice2; segments: 3) Hash Key: v2, v3 - -> HashAggregate + -> Streaming HashAggregate Group Key: v2, v3 -> Seq Scan on pds_t1 Optimizer: Postgres query optimizer @@ -3447,7 +3447,7 @@ explain (costs off) select v2,v3 from pds_t1 group by v2,v3; Group Key: v2, v3 -> Redistribute Motion 3:3 (slice2; segments: 3) Hash Key: v2, v3 - -> HashAggregate + -> Streaming HashAggregate Group Key: v2, v3 -> Seq Scan on pds_t1 Optimizer: Postgres query optimizer @@ -3462,7 +3462,7 @@ explain (costs off) select v2,v3,v4,v5,v6 from pds_t1 group by v2,v3,v4,v5,v6; Group Key: v2, v3, v4, v5, v6 -> Redistribute Motion 3:3 (slice2; segments: 3) Hash Key: v2, v3, v4, v5, v6 - -> HashAggregate + -> Streaming HashAggregate Group Key: v2, v3, v4, v5, v6 -> Seq Scan on pds_t1 Optimizer: Postgres query optimizer diff --git a/src/test/regress/expected/aqumv.out b/src/test/regress/expected/aqumv.out index 926ef05cd32..608b4db85a4 100644 --- a/src/test/regress/expected/aqumv.out +++ b/src/test/regress/expected/aqumv.out @@ -3412,7 +3412,7 @@ select c, b, sum(a), count(b) from t0 group by b, c; -> Redistribute Motion 3:3 (slice2; segments: 3) Output: c, b, (PARTIAL sum(a)), (PARTIAL count(b)) Hash Key: b, c - -> Partial HashAggregate + -> Streaming Partial HashAggregate Output: c, b, PARTIAL sum(a), PARTIAL count(b) Group Key: t0.b, t0.c -> Seq Scan on aqumv.t0 @@ -3468,7 +3468,7 @@ select b, sum(a), c, count(b) from t0 group by c, b; -> Redistribute Motion 3:3 (slice2; segments: 3) Output: b, c, (PARTIAL sum(a)), (PARTIAL count(b)) Hash Key: c, b - -> Partial HashAggregate + -> Streaming Partial HashAggregate Output: b, c, PARTIAL sum(a), PARTIAL count(b) Group Key: t0.c, t0.b -> Seq Scan on aqumv.t0 @@ -3524,7 +3524,7 @@ select b + c + 1, sum(a) + count(b) from t0 group by c, b; -> Redistribute Motion 3:3 (slice2; segments: 3) Output: c, b, (PARTIAL sum(a)), (PARTIAL count(b)) Hash Key: c, b - -> Partial HashAggregate + -> Streaming Partial HashAggregate Output: c, b, PARTIAL sum(a), PARTIAL count(b) Group Key: t0.c, t0.b -> Seq Scan on aqumv.t0 @@ -3580,7 +3580,7 @@ select c, count(b) from t0 group by c ; -> Redistribute Motion 3:3 (slice2; segments: 3) Output: c, (PARTIAL count(b)) Hash Key: c - -> Partial HashAggregate + -> Streaming Partial HashAggregate Output: c, PARTIAL count(b) Group Key: t0.c -> Seq Scan on aqumv.t0 @@ -3612,7 +3612,7 @@ select c, count(b) from t0 group by c ; -> Redistribute Motion 3:3 (slice2; segments: 3) Output: c, (PARTIAL count(b)) Hash Key: c - -> Partial HashAggregate + -> Streaming Partial HashAggregate Output: c, PARTIAL count(b) Group Key: t0.c -> Seq Scan on aqumv.t0 @@ -3645,7 +3645,7 @@ select c, b, count(b) from t0 where a > 3 group by c, b; -> Redistribute Motion 3:3 (slice2; segments: 3) Output: c, b, (PARTIAL count(b)) Hash Key: c, b - -> Partial HashAggregate + -> Streaming Partial HashAggregate Output: c, b, PARTIAL count(b) Group Key: t0.c, t0.b -> Seq Scan on aqumv.t0 @@ -3696,7 +3696,7 @@ select count(b), b, c from t0 where a > 3 group by b, c; -> Redistribute Motion 3:3 (slice2; segments: 3) Output: b, c, (PARTIAL count(b)) Hash Key: b, c - -> Partial HashAggregate + -> Streaming Partial HashAggregate Output: b, c, PARTIAL count(b) Group Key: t0.b, t0.c -> Seq Scan on aqumv.t0 @@ -3747,7 +3747,7 @@ select count(b) + 1, b + 1, c from t0 where a > 3 group by b, c; -> Redistribute Motion 3:3 (slice2; segments: 3) Output: c, b, (PARTIAL count(b)) Hash Key: b, c - -> Partial HashAggregate + -> Streaming Partial HashAggregate Output: c, b, PARTIAL count(b) Group Key: t0.b, t0.c -> Seq Scan on aqumv.t0 @@ -3798,7 +3798,7 @@ select b, c, count(b) from t0 where a > 3 and b > 1 group by b, c; -> Redistribute Motion 3:3 (slice2; segments: 3) Output: b, c, (PARTIAL count(b)) Hash Key: b, c - -> Partial HashAggregate + -> Streaming Partial HashAggregate Output: b, c, PARTIAL count(b) Group Key: t0.b, t0.c -> Seq Scan on aqumv.t0 @@ -3828,7 +3828,7 @@ select b, c, count(b) from t0 where a > 3 and b > 1 group by b, c; -> Redistribute Motion 3:3 (slice2; segments: 3) Output: b, c, (PARTIAL count(b)) Hash Key: b, c - -> Partial HashAggregate + -> Streaming Partial HashAggregate Output: b, c, PARTIAL count(b) Group Key: t0.b, t0.c -> Seq Scan on aqumv.t0 diff --git a/src/test/regress/expected/bfv_aggregate.out b/src/test/regress/expected/bfv_aggregate.out index e80bd8e5405..472e2ca98b3 100644 --- a/src/test/regress/expected/bfv_aggregate.out +++ b/src/test/regress/expected/bfv_aggregate.out @@ -1686,7 +1686,7 @@ SELECT a.x, sum(b.x) FROM pagg_tab1 a FULL OUTER JOIN pagg_tab2 b ON a.x = b.y G Group Key: a.x -> Redistribute Motion 3:3 (slice2; segments: 3) Hash Key: a.x - -> Partial HashAggregate + -> Streaming Partial HashAggregate Group Key: a.x -> Hash Full Join Hash Cond: (a.x = b.y) @@ -1961,7 +1961,7 @@ explain (verbose on, costs off) select ex2.b/2, sum(ex1.a) from ex1, (select a, -> Redistribute Motion 3:3 (slice2; segments: 3) Output: ((COALESCE(ex2.b, 1) / 2)), (PARTIAL sum(ex1.a)) Hash Key: ((COALESCE(ex2.b, 1) / 2)) - -> Partial HashAggregate + -> Streaming Partial HashAggregate Output: ((COALESCE(ex2.b, 1) / 2)), PARTIAL sum(ex1.a) Group Key: (COALESCE(ex2.b, 1) / 2) -> Hash Join @@ -1999,7 +1999,7 @@ explain (verbose on, costs off) SELECT b/2, sum(b) * (b/2) FROM ex1 GROUP BY b/ -> Redistribute Motion 3:3 (slice2; segments: 3) Output: ((b / 2)), (PARTIAL sum(b)) Hash Key: ((b / 2)) - -> Partial HashAggregate + -> Streaming Partial HashAggregate Output: ((b / 2)), PARTIAL sum(b) Group Key: (ex1.b / 2) -> Seq Scan on bfv_aggregate.ex1 diff --git a/src/test/regress/expected/cbdb_parallel.out b/src/test/regress/expected/cbdb_parallel.out index da3216896ff..35e90eebfa1 100644 --- a/src/test/regress/expected/cbdb_parallel.out +++ b/src/test/regress/expected/cbdb_parallel.out @@ -3105,7 +3105,7 @@ select distinct a from t_distinct_0; Group Key: a -> Redistribute Motion 3:3 (slice2; segments: 3) Hash Key: a - -> HashAggregate + -> Streaming HashAggregate Group Key: a -> Seq Scan on t_distinct_0 Optimizer: Postgres query optimizer @@ -3286,14 +3286,14 @@ select distinct a from t_distinct_0 union select distinct b from t_distinct_0; Group Key: t_distinct_0.a -> Redistribute Motion 3:3 (slice3; segments: 3) Hash Key: t_distinct_0.a - -> HashAggregate + -> Streaming HashAggregate Group Key: t_distinct_0.a -> Seq Scan on t_distinct_0 -> HashAggregate Group Key: t_distinct_0_1.b -> Redistribute Motion 3:3 (slice4; segments: 3) Hash Key: t_distinct_0_1.b - -> HashAggregate + -> Streaming HashAggregate Group Key: t_distinct_0_1.b -> Seq Scan on t_distinct_0 t_distinct_0_1 Optimizer: Postgres query optimizer @@ -3459,7 +3459,7 @@ WHERE e.salary > ( Group Key: employees.department_id -> Redistribute Motion 3:3 (slice3; segments: 3) (cost=90.50..122.67 rows=990 width=36) Hash Key: employees.department_id - -> Partial HashAggregate (cost=90.50..102.87 rows=990 width=36) + -> Streaming Partial HashAggregate (cost=90.50..102.87 rows=990 width=36) Group Key: employees.department_id -> Seq Scan on employees (cost=0.00..71.67 rows=3767 width=36) Optimizer: Postgres query optimizer diff --git a/src/test/regress/expected/cte_prune.out b/src/test/regress/expected/cte_prune.out index a76bc064ce2..fb8a8fb933d 100644 --- a/src/test/regress/expected/cte_prune.out +++ b/src/test/regress/expected/cte_prune.out @@ -1230,11 +1230,11 @@ LIMIT 10; -> HashAggregate (cost=102580688686565152.00..102596190789768272.00 rows=247107000000000 width=48) Output: cup.c, cup.d, cup.e, t.d, t.b Group Key: cup.c, cup.d, cup.e, t.d, t.b - Planned Partitions: 512 + Planned Partitions: 256 -> Redistribute Motion 3:3 (slice3; segments: 3) (cost=93196181903903024.00..102459992361252656.00 rows=741321000000000 width=48) Output: cup.c, cup.d, cup.e, t.d, t.b Hash Key: cup.c, cup.d, cup.e, t.d, t.b - -> HashAggregate (cost=93196181903903024.00..102445165941252656.00 rows=741321000000000 width=48) + -> Streaming HashAggregate (cost=93196181903903024.00..102445165941252656.00 rows=741321000000000 width=48) Output: cup.c, cup.d, cup.e, t.d, t.b Group Key: cup.c, cup.d, cup.e, t.d, t.b Planned Partitions: 512 @@ -1590,7 +1590,7 @@ order by OUTERMOST_FOO.region,bad_headofstates.headofstate LIMIT 40; -> Redistribute Motion 3:3 (slice4; segments: 3) (cost=2625.14..2655.14 rows=1000 width=64) Output: country_2.region, (PARTIAL avg(country_2.population)) Hash Key: country_2.region - -> Partial HashAggregate (cost=2625.14..2635.14 rows=1000 width=64) + -> Streaming Partial HashAggregate (cost=2625.14..2635.14 rows=1000 width=64) Output: country_2.region, PARTIAL avg(country_2.population) Group Key: country_2.region -> Hash Join (cost=1662.17..2425.51 rows=39927 width=36) diff --git a/src/test/regress/expected/direct_dispatch.out b/src/test/regress/expected/direct_dispatch.out index 7fc4b3e4516..488260e790a 100644 --- a/src/test/regress/expected/direct_dispatch.out +++ b/src/test/regress/expected/direct_dispatch.out @@ -659,7 +659,7 @@ explain (costs off) select gp_segment_id, count(*) from bar_randDistr group by g Group Key: gp_segment_id -> Redistribute Motion 3:3 (slice2; segments: 3) Hash Key: gp_segment_id - -> Partial HashAggregate + -> Streaming Partial HashAggregate Group Key: gp_segment_id -> Seq Scan on bar_randdistr Optimizer: Postgres query optimizer diff --git a/src/test/regress/expected/eagerfree.out b/src/test/regress/expected/eagerfree.out index 53be6095c14..9658e9a8dd6 100644 --- a/src/test/regress/expected/eagerfree.out +++ b/src/test/regress/expected/eagerfree.out @@ -49,7 +49,7 @@ explain analyze select d, count(*) from smallt group by d; Peak Memory Usage: 0 kB -> Redistribute Motion 3:3 (slice2; segments: 3) (cost=1.50..3.47 rows=18 width=12) (actual time=0.395..1.643 rows=7 loops=1) Hash Key: d - -> Partial HashAggregate (cost=1.50..1.68 rows=18 width=12) (actual time=0.058..0.061 rows=10 loops=1) + -> Streaming Partial HashAggregate (cost=1.50..1.68 rows=18 width=12) (actual time=0.000..0.000 rows=10 loops=1) Group Key: d Peak Memory Usage: 0 kB -> Seq Scan on smallt (cost=0.00..1.33 rows=33 width=4) (actual time=0.017..0.024 rows=50 loops=1) @@ -183,7 +183,7 @@ where t1.d = t2.d; Peak Memory Usage: 0 kB -> Redistribute Motion 3:3 (slice2; segments: 3) (cost=1.50..3.47 rows=18 width=12) (actual time=0.659..1.284 rows=7 loops=1) Hash Key: smallt.d - -> Partial HashAggregate (cost=1.50..1.68 rows=18 width=12) (actual time=0.055..0.058 rows=10 loops=1) + -> Streaming Partial HashAggregate (cost=1.50..1.68 rows=18 width=12) (actual time=0.000..0.000 rows=10 loops=1) Group Key: smallt.d Peak Memory Usage: 0 kB -> Seq Scan on smallt (cost=0.00..1.33 rows=33 width=4) (actual time=0.015..0.022 rows=50 loops=1) @@ -193,7 +193,7 @@ where t1.d = t2.d; Peak Memory Usage: 0 kB -> Redistribute Motion 3:3 (slice3; segments: 3) (cost=1.50..3.47 rows=18 width=12) (actual time=0.003..0.470 rows=7 loops=1) Hash Key: smallt_1.d - -> Partial HashAggregate (cost=1.50..1.68 rows=18 width=12) (actual time=0.084..0.090 rows=10 loops=1) + -> Streaming Partial HashAggregate (cost=1.50..1.68 rows=18 width=12) (actual time=0.000..0.000 rows=10 loops=1) Group Key: smallt_1.d Peak Memory Usage: 0 kB -> Seq Scan on smallt smallt_1 (cost=0.00..1.33 rows=33 width=8) (actual time=0.022..0.033 rows=50 loops=1) @@ -282,7 +282,7 @@ explain analyze select d, count(*) from smallt group by d limit 5; -> Sort (cost=2.05..2.10 rows=18 width=12) (actual time=0.173..0.178 rows=10 loops=1) Sort Key: d Sort Method: quicksort Memory: 81kB - -> Partial HashAggregate (cost=1.50..1.68 rows=18 width=12) (actual time=0.108..0.130 rows=10 loops=1) + -> Streaming Partial HashAggregate (cost=1.50..1.68 rows=18 width=12) (actual time=0.000..0.000 rows=10 loops=1) Group Key: d Extra Text: (seg0) Hash chain length 1.1 avg, 2 max, using 9 of 32 buckets; total 0 expansions. -> Seq Scan on smallt (cost=0.00..1.33 rows=33 width=4) (actual time=0.025..0.036 rows=50 loops=1) diff --git a/src/test/regress/expected/gp_aggregates_costs.out b/src/test/regress/expected/gp_aggregates_costs.out index d4761c78b8f..1865c9ff746 100644 --- a/src/test/regress/expected/gp_aggregates_costs.out +++ b/src/test/regress/expected/gp_aggregates_costs.out @@ -22,7 +22,7 @@ explain select avg(b) from cost_agg_t1 group by c; Group Key: c -> Redistribute Motion 3:3 (slice2; segments: 3) (cost=5449.00..5509.00 rows=2000 width=36) Hash Key: c - -> Partial HashAggregate (cost=5449.00..5469.00 rows=2000 width=36) + -> Streaming Partial HashAggregate (cost=5449.00..5469.00 rows=2000 width=36) Group Key: c -> Seq Scan on cost_agg_t1 (cost=0.00..3782.33 rows=333333 width=8) Optimizer: Postgres query optimizer @@ -61,7 +61,7 @@ explain select avg(b) from cost_agg_t2 group by c; Planned Partitions: 8 -> Redistribute Motion 3:3 (slice2; segments: 3) (cost=6538.00..9602.35 rows=102145 width=36) Hash Key: c - -> Partial HashAggregate (cost=6538.00..7559.45 rows=102145 width=36) + -> Streaming Partial HashAggregate (cost=6538.00..7574.83 rows=103683 width=36) Group Key: c Planned Partitions: 8 -> Seq Scan on cost_agg_t2 (cost=0.00..4538.00 rows=400000 width=8) @@ -103,7 +103,7 @@ explain (costs off) select b, sum(a) from t_planner_force_multi_stage group by b Finalize HashAggregate Group Key: b -> Gather Motion 3:1 (slice1; segments: 3) - -> Partial HashAggregate + -> Streaming Partial HashAggregate Group Key: b -> Seq Scan on t_planner_force_multi_stage Optimizer: Postgres query optimizer diff --git a/src/test/regress/expected/gp_distinct_plans.out b/src/test/regress/expected/gp_distinct_plans.out index ea9d2e06952..15f5f039bc4 100644 --- a/src/test/regress/expected/gp_distinct_plans.out +++ b/src/test/regress/expected/gp_distinct_plans.out @@ -45,7 +45,7 @@ explain select distinct b from distinct_test; Group Key: b -> Redistribute Motion 3:3 (slice2; segments: 3) (cost=46.67..46.85 rows=6 width=4) Hash Key: b - -> HashAggregate (cost=46.67..46.73 rows=6 width=4) + -> Streaming HashAggregate (cost=46.67..46.73 rows=6 width=4) Group Key: b -> Seq Scan on distinct_test (cost=0.00..38.33 rows=3333 width=4) Optimizer: Postgres query optimizer diff --git a/src/test/regress/expected/gp_dqa.out b/src/test/regress/expected/gp_dqa.out index d53a1794a44..0b8222c9a25 100644 --- a/src/test/regress/expected/gp_dqa.out +++ b/src/test/regress/expected/gp_dqa.out @@ -2831,7 +2831,7 @@ explain (verbose on, costs off) select distinct sum(Distinct c), count(a), sum(d Group Key: (sum(DISTINCT dqa_f3.c)), (count(dqa_f3.a)), (sum(dqa_f3.d)) -> Gather Motion 3:1 (slice1; segments: 3) Output: (sum(DISTINCT c)), (count(a)), (sum(d)), b - -> HashAggregate + -> Streaming HashAggregate Output: (sum(DISTINCT c)), (count(a)), (sum(d)), b Group Key: sum(DISTINCT dqa_f3.c), count(dqa_f3.a), sum(dqa_f3.d) -> GroupAggregate diff --git a/src/test/regress/expected/gp_hashagg.out b/src/test/regress/expected/gp_hashagg.out index 38a293a684b..210ec705398 100644 --- a/src/test/regress/expected/gp_hashagg.out +++ b/src/test/regress/expected/gp_hashagg.out @@ -154,7 +154,7 @@ EXPLAIN (COSTS OFF, VERBOSE) :qry; -> Redistribute Motion 3:3 (slice2; segments: 3) Output: b, (PARTIAL sum(a) FILTER (WHERE false)), (PARTIAL max(c)) Hash Key: b - -> Partial HashAggregate + -> Streaming Partial HashAggregate Output: b, PARTIAL sum(a) FILTER (WHERE false), PARTIAL max(c) Group Key: test_combinefn_null.b -> Seq Scan on public.test_combinefn_null @@ -189,7 +189,7 @@ EXPLAIN (COSTS OFF, VERBOSE) :qry; -> Redistribute Motion 3:3 (slice2; segments: 3) Output: b, (PARTIAL var_pop((a)::integer) FILTER (WHERE false)), (PARTIAL max(c)) Hash Key: b - -> Partial HashAggregate + -> Streaming Partial HashAggregate Output: b, PARTIAL var_pop((a)::integer) FILTER (WHERE false), PARTIAL max(c) Group Key: test_combinefn_null.b -> Seq Scan on public.test_combinefn_null @@ -224,7 +224,7 @@ EXPLAIN (COSTS OFF, VERBOSE) :qry; -> Redistribute Motion 3:3 (slice2; segments: 3) Output: b, (PARTIAL sum((a)::numeric) FILTER (WHERE false)), (PARTIAL max(c)) Hash Key: b - -> Partial HashAggregate + -> Streaming Partial HashAggregate Output: b, PARTIAL sum((a)::numeric) FILTER (WHERE false), PARTIAL max(c) Group Key: test_combinefn_null.b -> Seq Scan on public.test_combinefn_null @@ -259,7 +259,7 @@ EXPLAIN (COSTS OFF, VERBOSE) :qry; -> Redistribute Motion 3:3 (slice2; segments: 3) Output: b, (PARTIAL var_pop((a)::numeric) FILTER (WHERE false)), (PARTIAL max(c)) Hash Key: b - -> Partial HashAggregate + -> Streaming Partial HashAggregate Output: b, PARTIAL var_pop((a)::numeric) FILTER (WHERE false), PARTIAL max(c) Group Key: test_combinefn_null.b -> Seq Scan on public.test_combinefn_null diff --git a/src/test/regress/expected/gpctas.out b/src/test/regress/expected/gpctas.out index cb0c2536bfe..d50f1b61065 100644 --- a/src/test/regress/expected/gpctas.out +++ b/src/test/regress/expected/gpctas.out @@ -28,7 +28,7 @@ SELECT attr, class, (select count(distinct class) from ctas_src) as dclass FROM -> Seq Scan on ctas_src ctas_src_1 -> Redistribute Motion 3:3 (slice1; segments: 3) Hash Key: ctas_src.attr - -> HashAggregate + -> Streaming HashAggregate Group Key: ctas_src.attr, ctas_src.class -> Seq Scan on ctas_src Optimizer: Postgres query optimizer @@ -57,7 +57,7 @@ SELECT attr, class, (select max(class) from ctas_src) as maxclass FROM ctas_src -> Seq Scan on ctas_src ctas_src_1 -> Redistribute Motion 3:3 (slice1; segments: 3) Hash Key: ctas_src.attr - -> HashAggregate + -> Streaming HashAggregate Group Key: ctas_src.attr, ctas_src.class -> Seq Scan on ctas_src Optimizer: Postgres query optimizer @@ -102,7 +102,7 @@ SELECT attr, class, (select count(distinct class) from ctas_src) as dclass, (sel -> Seq Scan on ctas_src ctas_src_3 -> Redistribute Motion 3:3 (slice1; segments: 3) Hash Key: ctas_src.attr - -> HashAggregate + -> Streaming HashAggregate Group Key: ctas_src.attr, ctas_src.class -> Seq Scan on ctas_src Optimizer: Postgres query optimizer diff --git a/src/test/regress/expected/gporca.out b/src/test/regress/expected/gporca.out index 4b2f0dac012..50da048fb61 100644 --- a/src/test/regress/expected/gporca.out +++ b/src/test/regress/expected/gporca.out @@ -10297,7 +10297,7 @@ ORDER BY 1 asc ; Group Key: ((((tt.event_ts / 100000) / 5) * 5)) -> Redistribute Motion 3:3 (slice2; segments: 3) (cost=39875.47..39912.97 rows=1000 width=16) Hash Key: ((((tt.event_ts / 100000) / 5) * 5)) - -> Partial HashAggregate (cost=39875.47..39892.97 rows=1000 width=16) + -> Streaming Partial HashAggregate (cost=39875.47..39892.97 rows=1000 width=16) Group Key: (((tt.event_ts / 100000) / 5) * 5) -> Hash Join (cost=202.00..39819.05 rows=11283 width=8) Hash Cond: ((tq.sym)::bpchar = tt.symbol) @@ -13084,7 +13084,7 @@ select * from foo join (select min_a, count(*) as cnt from (select min(a) as min Group Key: (min(tbitmap.a)) -> Redistribute Motion 3:3 (slice2; segments: 3) Hash Key: (min(tbitmap.a)) - -> Partial HashAggregate + -> Streaming Partial HashAggregate Group Key: min(tbitmap.a) -> HashAggregate Group Key: tbitmap.b @@ -14999,7 +14999,7 @@ explain (costs off) select max(s1) from foo inner join bar on j1 = j2 group by g Group Key: foo.g1 -> Redistribute Motion 3:3 (slice2; segments: 3) Hash Key: foo.g1 - -> Partial HashAggregate + -> Streaming Partial HashAggregate Group Key: foo.g1 -> Hash Join Hash Cond: (foo.j1 = bar.j2) diff --git a/src/test/regress/expected/indexjoin.out b/src/test/regress/expected/indexjoin.out index 6b032575f12..a154a134aeb 100644 --- a/src/test/regress/expected/indexjoin.out +++ b/src/test/regress/expected/indexjoin.out @@ -37,7 +37,7 @@ ORDER BY 1 asc ; Group Key: ((((tt.event_ts / 100000) / 5) * 5)) -> Redistribute Motion 3:3 (slice2; segments: 3) (cost=1236.97..1252.45 rows=413 width=16) Hash Key: ((((tt.event_ts / 100000) / 5) * 5)) - -> Partial HashAggregate (cost=1236.97..1244.19 rows=413 width=16) + -> Streaming Partial HashAggregate (cost=1236.97..1244.19 rows=413 width=16) Group Key: (((tt.event_ts / 100000) / 5) * 5) -> Hash Join (cost=17.20..1161.31 rows=15131 width=8) Hash Cond: (tt.symbol = (tq.sym)::bpchar) diff --git a/src/test/regress/expected/limit_gp.out b/src/test/regress/expected/limit_gp.out index 1c067690068..5d075e30e71 100644 --- a/src/test/regress/expected/limit_gp.out +++ b/src/test/regress/expected/limit_gp.out @@ -136,7 +136,7 @@ explain select distinct(a), sum(b) from t_volatile_limit_1 group by a order by a Group Key: a -> Redistribute Motion 3:3 (slice2; segments: 3) (cost=464.50..494.50 rows=1000 width=12) Hash Key: a - -> Partial HashAggregate (cost=464.50..474.50 rows=1000 width=12) + -> Streaming Partial HashAggregate (cost=464.50..474.50 rows=1000 width=12) Group Key: a -> Seq Scan on t_volatile_limit_1 (cost=0.00..321.00 rows=28700 width=8) Optimizer: Postgres query optimizer @@ -156,7 +156,7 @@ explain select distinct(a), sum(b) from t_volatile_limit_1 group by a order by a Group Key: a -> Redistribute Motion 3:3 (slice2; segments: 3) (cost=464.50..494.50 rows=1000 width=12) Hash Key: a - -> Partial HashAggregate (cost=464.50..474.50 rows=1000 width=12) + -> Streaming Partial HashAggregate (cost=464.50..474.50 rows=1000 width=12) Group Key: a -> Seq Scan on t_volatile_limit_1 (cost=0.00..321.00 rows=28700 width=8) Optimizer: Postgres query optimizer diff --git a/src/test/regress/expected/olap_plans.out b/src/test/regress/expected/olap_plans.out index f5ddcc039d4..8861e4a5c5f 100644 --- a/src/test/regress/expected/olap_plans.out +++ b/src/test/regress/expected/olap_plans.out @@ -86,7 +86,7 @@ explain select a, sum(d) from olap_test group by a; Group Key: a -> Redistribute Motion 3:3 (slice2; segments: 3) (cost=56.00..56.09 rows=3 width=12) Hash Key: a - -> Partial HashAggregate (cost=56.00..56.03 rows=3 width=12) + -> Streaming Partial HashAggregate (cost=56.00..56.03 rows=3 width=12) Group Key: a -> Seq Scan on olap_test (cost=0.00..39.33 rows=3333 width=8) Optimizer: Postgres query optimizer @@ -306,7 +306,7 @@ explain create table bar_ctas as select * from foo_ctas group by a, b distribute Group Key: a, b -> Redistribute Motion 3:3 (slice1; segments: 3) (cost=1.50..11.42 rows=10 width=8) Hash Key: b - -> HashAggregate (cost=1.50..1.60 rows=10 width=8) + -> Streaming HashAggregate (cost=1.50..1.60 rows=10 width=8) Group Key: a, b -> Seq Scan on foo_ctas (cost=0.00..1.33 rows=33 width=8) Optimizer: Postgres query optimizer @@ -325,7 +325,7 @@ explain insert into bar_ctas select * from foo_ctas group by a, b; Group Key: foo_ctas.a, foo_ctas.b -> Redistribute Motion 3:3 (slice2; segments: 3) (cost=1.50..11.42 rows=10 width=8) Hash Key: foo_ctas.a, foo_ctas.b - -> HashAggregate (cost=1.50..1.60 rows=10 width=8) + -> Streaming HashAggregate (cost=1.50..1.60 rows=10 width=8) Group Key: foo_ctas.a, foo_ctas.b -> Seq Scan on foo_ctas (cost=0.00..1.33 rows=33 width=8) Optimizer: Postgres query optimizer diff --git a/src/test/regress/expected/partition_aggregate.out b/src/test/regress/expected/partition_aggregate.out index 871b8e3c39a..e8d78fc6643 100644 --- a/src/test/regress/expected/partition_aggregate.out +++ b/src/test/regress/expected/partition_aggregate.out @@ -39,7 +39,7 @@ SELECT c, sum(a), avg(b), count(*), min(a), max(b) FROM pagg_tab GROUP BY c HAVI Filter: (avg(pagg_tab.d) < '15'::numeric) -> Redistribute Motion 3:3 (slice2; segments: 3) Hash Key: pagg_tab.c - -> Partial HashAggregate + -> Streaming Partial HashAggregate Group Key: pagg_tab.c -> Seq Scan on pagg_tab_p1 pagg_tab -> Finalize HashAggregate @@ -47,7 +47,7 @@ SELECT c, sum(a), avg(b), count(*), min(a), max(b) FROM pagg_tab GROUP BY c HAVI Filter: (avg(pagg_tab_1.d) < '15'::numeric) -> Redistribute Motion 3:3 (slice3; segments: 3) Hash Key: pagg_tab_1.c - -> Partial HashAggregate + -> Streaming Partial HashAggregate Group Key: pagg_tab_1.c -> Seq Scan on pagg_tab_p2 pagg_tab_1 -> Finalize GroupAggregate @@ -57,7 +57,7 @@ SELECT c, sum(a), avg(b), count(*), min(a), max(b) FROM pagg_tab GROUP BY c HAVI Sort Key: pagg_tab_2.c -> Redistribute Motion 3:3 (slice4; segments: 3) Hash Key: pagg_tab_2.c - -> Partial HashAggregate + -> Streaming Partial HashAggregate Group Key: pagg_tab_2.c -> Seq Scan on pagg_tab_p3 pagg_tab_2 Optimizer: Postgres query optimizer diff --git a/src/test/regress/expected/partition_join.out b/src/test/regress/expected/partition_join.out index 107cbc746e5..98431e7a104 100644 --- a/src/test/regress/expected/partition_join.out +++ b/src/test/regress/expected/partition_join.out @@ -1881,7 +1881,7 @@ SELECT avg(t1.a), avg(t2.b), t1.c, t2.c FROM plt1 t1 RIGHT JOIN plt2 t2 ON t1.c Group Key: t1.c, t2.c -> Redistribute Motion 3:3 (slice2; segments: 3) Hash Key: t1.c, t1.c - -> Partial HashAggregate + -> Streaming Partial HashAggregate Group Key: t1.c, t2.c -> Append -> Hash Join diff --git a/src/test/regress/expected/qp_misc_jiras.out b/src/test/regress/expected/qp_misc_jiras.out index 4cbafc3e684..3ed092217fd 100644 --- a/src/test/regress/expected/qp_misc_jiras.out +++ b/src/test/regress/expected/qp_misc_jiras.out @@ -4732,7 +4732,7 @@ else 'Unidentify' end Group Key: (CASE WHEN (ir_call_supplementary_svc_code = ANY ('{S20,S21}'::bpchar[])) THEN 'MO'::text ELSE 'foo'::text END), (CASE WHEN ((ir_call_type_group_code)::text = ANY ('{H,VH,PCB}'::text[])) THEN 'Thailland'::text ELSE 'Unidentify'::text END) -> Redistribute Motion 3:3 (slice2; segments: 3) (cost=75.08..180.27 rows=905 width=102) Hash Key: (CASE WHEN (ir_call_supplementary_svc_code = ANY ('{S20,S21}'::bpchar[])) THEN 'MO'::text ELSE 'foo'::text END), (CASE WHEN ((ir_call_type_group_code)::text = ANY ('{H,VH,PCB}'::text[])) THEN 'Thailland'::text ELSE 'Unidentify'::text END) - -> HashAggregate (cost=75.08..89.79 rows=905 width=102) + -> Streaming HashAggregate (cost=75.08..89.79 rows=905 width=64) Group Key: CASE WHEN (ir_call_supplementary_svc_code = ANY ('{S20,S21}'::bpchar[])) THEN 'MO'::text ELSE 'foo'::text END, CASE WHEN ((ir_call_type_group_code)::text = ANY ('{H,VH,PCB}'::text[])) THEN 'Thailland'::text ELSE 'Unidentify'::text END -> Seq Scan on ir_voice_sms_and_data (cost=0.00..65.42 rows=1933 width=102) Optimizer: Postgres query optimizer diff --git a/src/test/regress/expected/select_distinct.out b/src/test/regress/expected/select_distinct.out index 9d2882fd143..ce0f24e9f8f 100644 --- a/src/test/regress/expected/select_distinct.out +++ b/src/test/regress/expected/select_distinct.out @@ -144,7 +144,7 @@ SELECT count(*) FROM -> Redistribute Motion 3:3 (slice2; segments: 3) Output: tenk1.two, tenk1.four, tenk1.two Hash Key: tenk1.two, tenk1.four, tenk1.two - -> HashAggregate + -> Streaming HashAggregate Output: tenk1.two, tenk1.four, tenk1.two Group Key: tenk1.two, tenk1.four, tenk1.two -> Seq Scan on public.tenk1 diff --git a/src/test/regress/expected/shared_scan.out b/src/test/regress/expected/shared_scan.out index 2e4548d7235..2673aff0f8c 100644 --- a/src/test/regress/expected/shared_scan.out +++ b/src/test/regress/expected/shared_scan.out @@ -206,7 +206,7 @@ where Group Key: pk_list.schema_name, pk_list.table_name -> Redistribute Motion 3:3 (slice3; segments: 3) Hash Key: pk_list.schema_name, pk_list.table_name - -> HashAggregate + -> Streaming HashAggregate Group Key: pk_list.schema_name, pk_list.table_name -> Seq Scan on pk_list -> Materialize @@ -219,7 +219,7 @@ where Group Key: pk_list_1.schema_name, pk_list_1.table_name -> Redistribute Motion 3:3 (slice5; segments: 3) Hash Key: pk_list_1.schema_name, pk_list_1.table_name - -> HashAggregate + -> Streaming HashAggregate Group Key: pk_list_1.schema_name, pk_list_1.table_name -> Seq Scan on pk_list pk_list_1 SubPlan 1 diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out index ea96cc3ca7b..8c3f7dfe580 100644 --- a/src/test/regress/expected/subselect.out +++ b/src/test/regress/expected/subselect.out @@ -2046,7 +2046,7 @@ group by j, q1; -> Redistribute Motion 3:3 (slice2; segments: 3) Output: t.j, ((SubPlan 1)) Hash Key: t.j, ((SubPlan 1)) - -> HashAggregate + -> Streaming HashAggregate Output: t.j, ((SubPlan 1)) Group Key: t.j, (SubPlan 1) -> Seq Scan on public.t diff --git a/src/test/regress/expected/window.out b/src/test/regress/expected/window.out index 36ea794ff8a..568a3feb0b0 100644 --- a/src/test/regress/expected/window.out +++ b/src/test/regress/expected/window.out @@ -1111,7 +1111,7 @@ select first_value(max(x)) over (), y Group Key: ((tenk1.ten + tenk1.four)) -> Redistribute Motion 3:3 (slice2; segments: 3) Hash Key: ((tenk1.ten + tenk1.four)) - -> Partial HashAggregate + -> Streaming Partial HashAggregate Group Key: (tenk1.ten + tenk1.four) -> Seq Scan on tenk1 Optimizer: Postgres query optimizer diff --git a/src/test/regress/expected/write_parallel.out b/src/test/regress/expected/write_parallel.out index 55c03f7eb3e..c204b514ecf 100644 --- a/src/test/regress/expected/write_parallel.out +++ b/src/test/regress/expected/write_parallel.out @@ -21,7 +21,7 @@ HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sur Group Key: (length((stringu1)::text)) -> Redistribute Motion 3:3 (slice1; segments: 3) Hash Key: (length((stringu1)::text)) - -> HashAggregate + -> Streaming HashAggregate Group Key: length((stringu1)::text) -> Seq Scan on tenk1 Optimizer: Postgres query optimizer @@ -42,7 +42,7 @@ HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sur Group Key: (length((stringu1)::text)) -> Redistribute Motion 3:3 (slice1; segments: 3) Hash Key: (length((stringu1)::text)) - -> HashAggregate + -> Streaming HashAggregate Group Key: length((stringu1)::text) -> Seq Scan on tenk1 Optimizer: Postgres query optimizer @@ -63,7 +63,7 @@ HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sur Group Key: (length((stringu1)::text)) -> Redistribute Motion 3:3 (slice1; segments: 3) Hash Key: (length((stringu1)::text)) - -> HashAggregate + -> Streaming HashAggregate Group Key: length((stringu1)::text) -> Seq Scan on tenk1 Optimizer: Postgres query optimizer @@ -89,7 +89,7 @@ HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sur Group Key: (length((stringu1)::text)) -> Redistribute Motion 3:3 (slice1; segments: 3) Hash Key: (length((stringu1)::text)) - -> HashAggregate + -> Streaming HashAggregate Group Key: length((stringu1)::text) -> Seq Scan on tenk1 Optimizer: Postgres query optimizer --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
