2
2
-- PARTITION_AGGREGATE
3
3
-- Test partitionwise aggregation on partitioned tables
4
4
--
5
- -- Note: Various tests located within are sensitive to tables being
6
- -- auto-vacuumed while the tests are running. For this reason we
7
- -- run autovacuum_enabled = off for all tables.
5
+ -- Note: to ensure plan stability, it's a good idea to make the partitions of
6
+ -- any one partitioned table in this test all have different numbers of rows.
7
+ --
8
8
-- Enable partitionwise aggregate, which by default is disabled.
9
9
SET enable_partitionwise_aggregate TO true;
10
10
-- Enable partitionwise join, which by default is disabled.
@@ -15,9 +15,9 @@ SET max_parallel_workers_per_gather TO 0;
15
15
-- Tests for list partitioned tables.
16
16
--
17
17
CREATE TABLE pagg_tab (a int, b int, c text, d int) PARTITION BY LIST(c);
18
- CREATE TABLE pagg_tab_p1 PARTITION OF pagg_tab FOR VALUES IN ('0000', '0001', '0002', '0003') WITH (autovacuum_enabled = off );
19
- CREATE TABLE pagg_tab_p2 PARTITION OF pagg_tab FOR VALUES IN ('0004', ' 0005', '0006', '0007') WITH (autovacuum_enabled = off );
20
- CREATE TABLE pagg_tab_p3 PARTITION OF pagg_tab FOR VALUES IN ('0008', ' 0009', '0010', '0011') WITH (autovacuum_enabled = off );
18
+ CREATE TABLE pagg_tab_p1 PARTITION OF pagg_tab FOR VALUES IN ('0000', '0001', '0002', '0003', '0004' );
19
+ CREATE TABLE pagg_tab_p2 PARTITION OF pagg_tab FOR VALUES IN ('0005', '0006', '0007', '0008' );
20
+ CREATE TABLE pagg_tab_p3 PARTITION OF pagg_tab FOR VALUES IN ('0009', '0010', '0011');
21
21
INSERT INTO pagg_tab SELECT i % 20, i % 30, to_char(i % 12, 'FM0000'), i % 30 FROM generate_series(0, 2999) i;
22
22
ANALYZE pagg_tab;
23
23
-- When GROUP BY clause matches; full aggregation is performed for each partition.
@@ -400,13 +400,13 @@ SELECT a, sum(b order by a) FROM pagg_tab GROUP BY a ORDER BY 1, 2;
400
400
401
401
-- JOIN query
402
402
CREATE TABLE pagg_tab1(x int, y int) PARTITION BY RANGE(x);
403
- CREATE TABLE pagg_tab1_p1 PARTITION OF pagg_tab1 FOR VALUES FROM (0) TO (10) WITH (autovacuum_enabled = off) ;
404
- CREATE TABLE pagg_tab1_p2 PARTITION OF pagg_tab1 FOR VALUES FROM (10) TO (20) WITH (autovacuum_enabled = off) ;
405
- CREATE TABLE pagg_tab1_p3 PARTITION OF pagg_tab1 FOR VALUES FROM (20) TO (30) WITH (autovacuum_enabled = off) ;
403
+ CREATE TABLE pagg_tab1_p1 PARTITION OF pagg_tab1 FOR VALUES FROM (0) TO (10);
404
+ CREATE TABLE pagg_tab1_p2 PARTITION OF pagg_tab1 FOR VALUES FROM (10) TO (20);
405
+ CREATE TABLE pagg_tab1_p3 PARTITION OF pagg_tab1 FOR VALUES FROM (20) TO (30);
406
406
CREATE TABLE pagg_tab2(x int, y int) PARTITION BY RANGE(y);
407
- CREATE TABLE pagg_tab2_p1 PARTITION OF pagg_tab2 FOR VALUES FROM (0) TO (10) WITH (autovacuum_enabled = off) ;
408
- CREATE TABLE pagg_tab2_p2 PARTITION OF pagg_tab2 FOR VALUES FROM (10) TO (20) WITH (autovacuum_enabled = off) ;
409
- CREATE TABLE pagg_tab2_p3 PARTITION OF pagg_tab2 FOR VALUES FROM (20) TO (30) WITH (autovacuum_enabled = off) ;
407
+ CREATE TABLE pagg_tab2_p1 PARTITION OF pagg_tab2 FOR VALUES FROM (0) TO (10);
408
+ CREATE TABLE pagg_tab2_p2 PARTITION OF pagg_tab2 FOR VALUES FROM (10) TO (20);
409
+ CREATE TABLE pagg_tab2_p3 PARTITION OF pagg_tab2 FOR VALUES FROM (20) TO (30);
410
410
INSERT INTO pagg_tab1 SELECT i % 30, i % 20 FROM generate_series(0, 299, 2) i;
411
411
INSERT INTO pagg_tab2 SELECT i % 20, i % 30 FROM generate_series(0, 299, 3) i;
412
412
ANALYZE pagg_tab1;
@@ -820,9 +820,9 @@ SELECT a.x, a.y, count(*) FROM (SELECT * FROM pagg_tab1 WHERE x = 1 AND x = 2) a
820
820
821
821
-- Partition by multiple columns
822
822
CREATE TABLE pagg_tab_m (a int, b int, c int) PARTITION BY RANGE(a, ((a+b)/2));
823
- CREATE TABLE pagg_tab_m_p1 PARTITION OF pagg_tab_m FOR VALUES FROM (0, 0) TO (10, 10) WITH (autovacuum_enabled = off );
824
- CREATE TABLE pagg_tab_m_p2 PARTITION OF pagg_tab_m FOR VALUES FROM (10, 10 ) TO (20, 20) WITH (autovacuum_enabled = off );
825
- CREATE TABLE pagg_tab_m_p3 PARTITION OF pagg_tab_m FOR VALUES FROM (20, 20 ) TO (30, 30) WITH (autovacuum_enabled = off );
823
+ CREATE TABLE pagg_tab_m_p1 PARTITION OF pagg_tab_m FOR VALUES FROM (0, 0) TO (12, 12 );
824
+ CREATE TABLE pagg_tab_m_p2 PARTITION OF pagg_tab_m FOR VALUES FROM (12, 12 ) TO (22, 22 );
825
+ CREATE TABLE pagg_tab_m_p3 PARTITION OF pagg_tab_m FOR VALUES FROM (22, 22 ) TO (30, 30);
826
826
INSERT INTO pagg_tab_m SELECT i % 30, i % 40, i % 50 FROM generate_series(0, 2999) i;
827
827
ANALYZE pagg_tab_m;
828
828
-- Partial aggregation as GROUP BY clause does not match with PARTITION KEY
@@ -926,15 +926,15 @@ SELECT a, c, sum(b), avg(c), count(*) FROM pagg_tab_m GROUP BY (a+b)/2, 2, 1 HAV
926
926
927
927
-- Test with multi-level partitioning scheme
928
928
CREATE TABLE pagg_tab_ml (a int, b int, c text) PARTITION BY RANGE(a);
929
- CREATE TABLE pagg_tab_ml_p1 PARTITION OF pagg_tab_ml FOR VALUES FROM (0) TO (10) WITH (autovacuum_enabled = off) ;
929
+ CREATE TABLE pagg_tab_ml_p1 PARTITION OF pagg_tab_ml FOR VALUES FROM (0) TO (10);
930
930
CREATE TABLE pagg_tab_ml_p2 PARTITION OF pagg_tab_ml FOR VALUES FROM (10) TO (20) PARTITION BY LIST (c);
931
- CREATE TABLE pagg_tab_ml_p2_s1 PARTITION OF pagg_tab_ml_p2 FOR VALUES IN ('0000', '0001') WITH (autovacuum_enabled = off );
932
- CREATE TABLE pagg_tab_ml_p2_s2 PARTITION OF pagg_tab_ml_p2 FOR VALUES IN ('0002', ' 0003') WITH (autovacuum_enabled = off );
931
+ CREATE TABLE pagg_tab_ml_p2_s1 PARTITION OF pagg_tab_ml_p2 FOR VALUES IN ('0000', '0001', '0002' );
932
+ CREATE TABLE pagg_tab_ml_p2_s2 PARTITION OF pagg_tab_ml_p2 FOR VALUES IN ('0003');
933
933
-- This level of partitioning has different column positions than the parent
934
934
CREATE TABLE pagg_tab_ml_p3(b int, c text, a int) PARTITION BY RANGE (b);
935
- CREATE TABLE pagg_tab_ml_p3_s1(c text, a int, b int) WITH (autovacuum_enabled = off) ;
936
- CREATE TABLE pagg_tab_ml_p3_s2 PARTITION OF pagg_tab_ml_p3 FOR VALUES FROM (5 ) TO (10) WITH (autovacuum_enabled = off );
937
- ALTER TABLE pagg_tab_ml_p3 ATTACH PARTITION pagg_tab_ml_p3_s1 FOR VALUES FROM (0) TO (5 );
935
+ CREATE TABLE pagg_tab_ml_p3_s1(c text, a int, b int);
936
+ CREATE TABLE pagg_tab_ml_p3_s2 PARTITION OF pagg_tab_ml_p3 FOR VALUES FROM (7 ) TO (10);
937
+ ALTER TABLE pagg_tab_ml_p3 ATTACH PARTITION pagg_tab_ml_p3_s1 FOR VALUES FROM (0) TO (7 );
938
938
ALTER TABLE pagg_tab_ml ATTACH PARTITION pagg_tab_ml_p3 FOR VALUES FROM (20) TO (30);
939
939
INSERT INTO pagg_tab_ml SELECT i % 30, i % 10, to_char(i % 4, 'FM0000') FROM generate_series(0, 29999) i;
940
940
ANALYZE pagg_tab_ml;
@@ -1252,15 +1252,15 @@ SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b ORDER BY 1, 2, 3;
1252
1252
-> Partial HashAggregate
1253
1253
Group Key: pagg_tab_ml_1.b
1254
1254
-> Parallel Seq Scan on pagg_tab_ml_p2_s1 pagg_tab_ml_1
1255
- -> Partial HashAggregate
1256
- Group Key: pagg_tab_ml_2.b
1257
- -> Parallel Seq Scan on pagg_tab_ml_p2_s2 pagg_tab_ml_2
1258
1255
-> Partial HashAggregate
1259
1256
Group Key: pagg_tab_ml_3.b
1260
1257
-> Parallel Seq Scan on pagg_tab_ml_p3_s1 pagg_tab_ml_3
1261
1258
-> Partial HashAggregate
1262
1259
Group Key: pagg_tab_ml_4.b
1263
1260
-> Parallel Seq Scan on pagg_tab_ml_p3_s2 pagg_tab_ml_4
1261
+ -> Partial HashAggregate
1262
+ Group Key: pagg_tab_ml_2.b
1263
+ -> Parallel Seq Scan on pagg_tab_ml_p2_s2 pagg_tab_ml_2
1264
1264
(24 rows)
1265
1265
1266
1266
SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b HAVING avg(a) < 15 ORDER BY 1, 2, 3;
@@ -1291,10 +1291,6 @@ SELECT a, sum(b), count(*) FROM pagg_tab_ml GROUP BY a, b, c HAVING avg(b) > 7 O
1291
1291
Group Key: pagg_tab_ml_1.a, pagg_tab_ml_1.b, pagg_tab_ml_1.c
1292
1292
Filter: (avg(pagg_tab_ml_1.b) > '7'::numeric)
1293
1293
-> Seq Scan on pagg_tab_ml_p2_s1 pagg_tab_ml_1
1294
- -> HashAggregate
1295
- Group Key: pagg_tab_ml_2.a, pagg_tab_ml_2.b, pagg_tab_ml_2.c
1296
- Filter: (avg(pagg_tab_ml_2.b) > '7'::numeric)
1297
- -> Seq Scan on pagg_tab_ml_p2_s2 pagg_tab_ml_2
1298
1294
-> HashAggregate
1299
1295
Group Key: pagg_tab_ml_3.a, pagg_tab_ml_3.b, pagg_tab_ml_3.c
1300
1296
Filter: (avg(pagg_tab_ml_3.b) > '7'::numeric)
@@ -1303,6 +1299,10 @@ SELECT a, sum(b), count(*) FROM pagg_tab_ml GROUP BY a, b, c HAVING avg(b) > 7 O
1303
1299
Group Key: pagg_tab_ml_4.a, pagg_tab_ml_4.b, pagg_tab_ml_4.c
1304
1300
Filter: (avg(pagg_tab_ml_4.b) > '7'::numeric)
1305
1301
-> Seq Scan on pagg_tab_ml_p3_s2 pagg_tab_ml_4
1302
+ -> HashAggregate
1303
+ Group Key: pagg_tab_ml_2.a, pagg_tab_ml_2.b, pagg_tab_ml_2.c
1304
+ Filter: (avg(pagg_tab_ml_2.b) > '7'::numeric)
1305
+ -> Seq Scan on pagg_tab_ml_p2_s2 pagg_tab_ml_2
1306
1306
(25 rows)
1307
1307
1308
1308
SELECT a, sum(b), count(*) FROM pagg_tab_ml GROUP BY a, b, c HAVING avg(b) > 7 ORDER BY 1, 2, 3;
@@ -1332,9 +1332,9 @@ SELECT a, sum(b), count(*) FROM pagg_tab_ml GROUP BY a, b, c HAVING avg(b) > 7 O
1332
1332
-- costing such plans.
1333
1333
SET parallel_setup_cost TO 10;
1334
1334
CREATE TABLE pagg_tab_para(x int, y int) PARTITION BY RANGE(x);
1335
- CREATE TABLE pagg_tab_para_p1 PARTITION OF pagg_tab_para FOR VALUES FROM (0) TO (10) WITH (autovacuum_enabled = off );
1336
- CREATE TABLE pagg_tab_para_p2 PARTITION OF pagg_tab_para FOR VALUES FROM (10 ) TO (20) WITH (autovacuum_enabled = off );
1337
- CREATE TABLE pagg_tab_para_p3 PARTITION OF pagg_tab_para FOR VALUES FROM (20 ) TO (30) WITH (autovacuum_enabled = off );
1335
+ CREATE TABLE pagg_tab_para_p1 PARTITION OF pagg_tab_para FOR VALUES FROM (0) TO (12 );
1336
+ CREATE TABLE pagg_tab_para_p2 PARTITION OF pagg_tab_para FOR VALUES FROM (12 ) TO (22 );
1337
+ CREATE TABLE pagg_tab_para_p3 PARTITION OF pagg_tab_para FOR VALUES FROM (22 ) TO (30);
1338
1338
INSERT INTO pagg_tab_para SELECT i % 30, i % 20 FROM generate_series(0, 29999) i;
1339
1339
ANALYZE pagg_tab_para;
1340
1340
-- When GROUP BY clause matches; full aggregation is performed for each partition.
0 commit comments