mirror of
https://github.com/postgres/postgres.git
synced 2025-05-02 11:44:50 +03:00
Force parallelism in partition_aggregate
Commit db0d67db2 tweaked sort costing, which however resulted in a couple plan changes in our regression tests. Most of the new plans were fine, but partition_aggregate were meant to test parallel plans and the new plans were serial. Fix that by lowering parallel_setup_cost to 0, which is enough to switch to the parallel plan again. Report and patch by David Rowley. Author: David Rowley Reviewed-by: Tomas Vondra Discussion: https://postgr.es/m/CAApHDvpVFgWzXdtUQkjyOPhNrNvumRi_=ftgS79KeAZ92tnHKQ@mail.gmail.com
This commit is contained in:
parent
4209126655
commit
01474f5698
@ -942,6 +942,7 @@ INSERT INTO pagg_tab_ml SELECT i % 30, i % 10, to_char(i % 4, 'FM0000') FROM gen
|
||||
ANALYZE pagg_tab_ml;
|
||||
-- For Parallel Append
|
||||
SET max_parallel_workers_per_gather TO 2;
|
||||
SET parallel_setup_cost = 0;
|
||||
-- Full aggregation at level 1 as GROUP BY clause matches with PARTITION KEY
|
||||
-- for level 1 only. For subpartitions, GROUP BY clause does not match with
|
||||
-- PARTITION KEY, but still we do not see a partial aggregation as array_agg()
|
||||
@ -949,24 +950,18 @@ SET max_parallel_workers_per_gather TO 2;
|
||||
EXPLAIN (COSTS OFF)
|
||||
SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3 ORDER BY 1, 2, 3;
|
||||
QUERY PLAN
|
||||
--------------------------------------------------------------------------------------
|
||||
Sort
|
||||
--------------------------------------------------------------------------------------------
|
||||
Gather Merge
|
||||
Workers Planned: 2
|
||||
-> Sort
|
||||
Sort Key: pagg_tab_ml.a, (sum(pagg_tab_ml.b)), (array_agg(DISTINCT pagg_tab_ml.c))
|
||||
-> Append
|
||||
-> Parallel Append
|
||||
-> GroupAggregate
|
||||
Group Key: pagg_tab_ml.a
|
||||
Filter: (avg(pagg_tab_ml.b) < '3'::numeric)
|
||||
-> Sort
|
||||
Sort Key: pagg_tab_ml.a
|
||||
-> Seq Scan on pagg_tab_ml_p1 pagg_tab_ml
|
||||
-> GroupAggregate
|
||||
Group Key: pagg_tab_ml_2.a
|
||||
Filter: (avg(pagg_tab_ml_2.b) < '3'::numeric)
|
||||
-> Sort
|
||||
Sort Key: pagg_tab_ml_2.a
|
||||
-> Append
|
||||
-> Seq Scan on pagg_tab_ml_p2_s1 pagg_tab_ml_2
|
||||
-> Seq Scan on pagg_tab_ml_p2_s2 pagg_tab_ml_3
|
||||
-> GroupAggregate
|
||||
Group Key: pagg_tab_ml_5.a
|
||||
Filter: (avg(pagg_tab_ml_5.b) < '3'::numeric)
|
||||
@ -975,7 +970,15 @@ SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HA
|
||||
-> Append
|
||||
-> Seq Scan on pagg_tab_ml_p3_s1 pagg_tab_ml_5
|
||||
-> Seq Scan on pagg_tab_ml_p3_s2 pagg_tab_ml_6
|
||||
(25 rows)
|
||||
-> GroupAggregate
|
||||
Group Key: pagg_tab_ml_2.a
|
||||
Filter: (avg(pagg_tab_ml_2.b) < '3'::numeric)
|
||||
-> Sort
|
||||
Sort Key: pagg_tab_ml_2.a
|
||||
-> Append
|
||||
-> Seq Scan on pagg_tab_ml_p2_s1 pagg_tab_ml_2
|
||||
-> Seq Scan on pagg_tab_ml_p2_s2 pagg_tab_ml_3
|
||||
(27 rows)
|
||||
|
||||
SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3 ORDER BY 1, 2, 3;
|
||||
a | sum | array_agg | count
|
||||
@ -995,22 +998,16 @@ SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HA
|
||||
EXPLAIN (COSTS OFF)
|
||||
SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3;
|
||||
QUERY PLAN
|
||||
---------------------------------------------------------------------
|
||||
Append
|
||||
---------------------------------------------------------------------------
|
||||
Gather
|
||||
Workers Planned: 2
|
||||
-> Parallel Append
|
||||
-> GroupAggregate
|
||||
Group Key: pagg_tab_ml.a
|
||||
Filter: (avg(pagg_tab_ml.b) < '3'::numeric)
|
||||
-> Sort
|
||||
Sort Key: pagg_tab_ml.a
|
||||
-> Seq Scan on pagg_tab_ml_p1 pagg_tab_ml
|
||||
-> GroupAggregate
|
||||
Group Key: pagg_tab_ml_2.a
|
||||
Filter: (avg(pagg_tab_ml_2.b) < '3'::numeric)
|
||||
-> Sort
|
||||
Sort Key: pagg_tab_ml_2.a
|
||||
-> Append
|
||||
-> Seq Scan on pagg_tab_ml_p2_s1 pagg_tab_ml_2
|
||||
-> Seq Scan on pagg_tab_ml_p2_s2 pagg_tab_ml_3
|
||||
-> GroupAggregate
|
||||
Group Key: pagg_tab_ml_5.a
|
||||
Filter: (avg(pagg_tab_ml_5.b) < '3'::numeric)
|
||||
@ -1019,8 +1016,17 @@ SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HA
|
||||
-> Append
|
||||
-> Seq Scan on pagg_tab_ml_p3_s1 pagg_tab_ml_5
|
||||
-> Seq Scan on pagg_tab_ml_p3_s2 pagg_tab_ml_6
|
||||
(23 rows)
|
||||
-> GroupAggregate
|
||||
Group Key: pagg_tab_ml_2.a
|
||||
Filter: (avg(pagg_tab_ml_2.b) < '3'::numeric)
|
||||
-> Sort
|
||||
Sort Key: pagg_tab_ml_2.a
|
||||
-> Append
|
||||
-> Seq Scan on pagg_tab_ml_p2_s1 pagg_tab_ml_2
|
||||
-> Seq Scan on pagg_tab_ml_p2_s2 pagg_tab_ml_3
|
||||
(25 rows)
|
||||
|
||||
RESET parallel_setup_cost;
|
||||
-- Full aggregation at level 1 as GROUP BY clause matches with PARTITION KEY
|
||||
-- for level 1 only. For subpartitions, GROUP BY clause does not match with
|
||||
-- PARTITION KEY, thus we will have a partial aggregation for them.
|
||||
|
@ -222,6 +222,7 @@ ANALYZE pagg_tab_ml;
|
||||
|
||||
-- For Parallel Append
|
||||
SET max_parallel_workers_per_gather TO 2;
|
||||
SET parallel_setup_cost = 0;
|
||||
|
||||
-- Full aggregation at level 1 as GROUP BY clause matches with PARTITION KEY
|
||||
-- for level 1 only. For subpartitions, GROUP BY clause does not match with
|
||||
@ -235,6 +236,8 @@ SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HA
|
||||
EXPLAIN (COSTS OFF)
|
||||
SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3;
|
||||
|
||||
RESET parallel_setup_cost;
|
||||
|
||||
-- Full aggregation at level 1 as GROUP BY clause matches with PARTITION KEY
|
||||
-- for level 1 only. For subpartitions, GROUP BY clause does not match with
|
||||
-- PARTITION KEY, thus we will have a partial aggregation for them.
|
||||
|
Loading…
x
Reference in New Issue
Block a user