@ -2449,26 +2449,30 @@ set enable_sort to default;
-- aggregation. Force spilling in both cases by setting work_mem low.
-- aggregation. Force spilling in both cases by setting work_mem low.
--
--
set work_mem='64kB';
set work_mem='64kB';
create table agg_data_2k as
select g from generate_series(0, 1999) g;
analyze agg_data_2k;
create table agg_data_20k as
select g from generate_series(0, 19999) g;
analyze agg_data_20k;
-- Produce results with sorting.
-- Produce results with sorting.
set enable_hashagg = false;
set enable_hashagg = false;
set jit_above_cost = 0;
set jit_above_cost = 0;
explain (costs off)
explain (costs off)
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
from generate_series(0, 19999) g
from agg_data_20k group by g%10000;
group by g%10000;
QUERY PLAN
QUERY PLAN
--------------------------------------
------------------------------------------------
GroupAggregate
GroupAggregate
Group Key: ((g % 10000))
Group Key: ((g % 10000))
-> Sort
-> Sort
Sort Key: ((g % 10000))
Sort Key: ((g % 10000))
-> Function Scan on generate_series g
-> Seq Scan on agg_data_20k
(5 rows)
(5 rows)
create table agg_group_1 as
create table agg_group_1 as
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
from generate_series(0, 19999) g
from agg_data_20k group by g%10000;
group by g%10000;
create table agg_group_2 as
create table agg_group_2 as
select * from
select * from
(values (100), (300), (500)) as r(a),
(values (100), (300), (500)) as r(a),
@ -2476,37 +2480,33 @@ select * from
select (g/2)::numeric as c1,
select (g/2)::numeric as c1,
array_agg(g::numeric) as c2,
array_agg(g::numeric) as c2,
count(*) as c3
count(*) as c3
from generate_series(0, 1999) g
from agg_data_2k
where g < r.a
where g < r.a
group by g/2) as s;
group by g/2) as s;
set jit_above_cost to default;
set jit_above_cost to default;
create table agg_group_3 as
create table agg_group_3 as
select (g/2)::numeric as c1, sum(7::int4) as c2, count(*) as c3
select (g/2)::numeric as c1, sum(7::int4) as c2, count(*) as c3
from generate_series(0, 1999) g
from agg_data_2k group by g/2;
group by g/2;
create table agg_group_4 as
create table agg_group_4 as
select (g/2)::numeric as c1, array_agg(g::numeric) as c2, count(*) as c3
select (g/2)::numeric as c1, array_agg(g::numeric) as c2, count(*) as c3
from generate_series(0, 1999) g
from agg_data_2k group by g/2;
group by g/2;
-- Produce results with hash aggregation
-- Produce results with hash aggregation
set enable_hashagg = true;
set enable_hashagg = true;
set enable_sort = false;
set enable_sort = false;
set jit_above_cost = 0;
set jit_above_cost = 0;
explain (costs off)
explain (costs off)
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
from generate_series(0, 19999) g
from agg_data_20k group by g%10000;
group by g%10000;
QUERY PLAN
QUERY PLAN
--------------------------------
------------------------------------------
HashAggregate
HashAggregate
Group Key: (g % 10000)
Group Key: (g % 10000)
-> Function Scan on generate_series g
-> Seq Scan on agg_data_20k
(3 rows)
(3 rows)
create table agg_hash_1 as
create table agg_hash_1 as
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
from generate_series(0, 19999) g
from agg_data_20k group by g%10000;
group by g%10000;
create table agg_hash_2 as
create table agg_hash_2 as
select * from
select * from
(values (100), (300), (500)) as r(a),
(values (100), (300), (500)) as r(a),
@ -2514,18 +2514,16 @@ select * from
select (g/2)::numeric as c1,
select (g/2)::numeric as c1,
array_agg(g::numeric) as c2,
array_agg(g::numeric) as c2,
count(*) as c3
count(*) as c3
from generate_series(0, 1999) g
from agg_data_2k
where g < r.a
where g < r.a
group by g/2) as s;
group by g/2) as s;
set jit_above_cost to default;
set jit_above_cost to default;
create table agg_hash_3 as
create table agg_hash_3 as
select (g/2)::numeric as c1, sum(7::int4) as c2, count(*) as c3
select (g/2)::numeric as c1, sum(7::int4) as c2, count(*) as c3
from generate_series(0, 1999) g
from agg_data_2k group by g/2;
group by g/2;
create table agg_hash_4 as
create table agg_hash_4 as
select (g/2)::numeric as c1, array_agg(g::numeric) as c2, count(*) as c3
select (g/2)::numeric as c1, array_agg(g::numeric) as c2, count(*) as c3
from generate_series(0, 1999) g
from agg_data_2k group by g/2;
group by g/2;
set enable_sort = true;
set enable_sort = true;
set work_mem to default;
set work_mem to default;
-- Compare group aggregation results to hash aggregation results
-- Compare group aggregation results to hash aggregation results