Normal aggregate and partition wise aggregate have a big difference rows cost:
begin; create table t1(id integer, name text) partition by hash(id); create table t1_0 partition of t1 for values with(modulus 3, remainder 0); create table t1_1 partition of t1 for values with(modulus 3, remainder 1); create table t1_2 partition of t1 for values with(modulus 3, remainder 2); commit; normal aggregate rows cost is 200. explain (verbose) select count(1) from t1 group by id; HashAggregate (cost=106.20..108.20 rows=200 width=12) --here rows is 200 Output: count(1), t1.id Group Key: t1.id -> Append (cost=0.00..87.15 rows=3810 width=4) -> Seq Scan on public.t1_0 t1_1 (cost=0.00..22.70 rows=1270 width=4) Output: t1_1.id -> Seq Scan on public.t1_1 t1_2 (cost=0.00..22.70 rows=1270 width=4) Output: t1_2.id -> Seq Scan on public.t1_2 t1_3 (cost=0.00..22.70 rows=1270 width=4) Output: t1_3.id And partition wise aggregate rows cost is 600 set enable_partitionwise_aggregate = on; explain (verbose) select count(1) from t1 group by id; Append (cost=29.05..96.15 rows=600 width=12) --here rows is 600 -> HashAggregate (cost=29.05..31.05 rows=200 width=12) --this rows looks like same as normal aggregate Output: count(1), t1.id Group Key: t1.id -> Seq Scan on public.t1_0 t1 (cost=0.00..22.70 rows=1270 width=4) Output: t1.id -> HashAggregate (cost=29.05..31.05 rows=200 width=12) Output: count(1), t1_1.id Group Key: t1_1.id -> Seq Scan on public.t1_1 (cost=0.00..22.70 rows=1270 width=4) Output: t1_1.id -> HashAggregate (cost=29.05..31.05 rows=200 width=12) Output: count(1), t1_2.id Group Key: t1_2.id -> Seq Scan on public.t1_2 (cost=0.00..22.70 rows=1270 width=4) Output: t1_2.id Source code is 15beta1(7fdbdf204920ac279f280d0a8e96946fdaf41aef)