SET max_parallel_workers_per_gather = 8; SET force_parallel_mode = on; CREATE TABLE data AS SELECT id, isagg(k, id+dup+k) as data FROM generate_series(1000,10000, 100) id, generate_series(1,10) k, generate_series(1,1000) dup GROUP BY id, dup ORDER BY id; ALTER TABLE data set (parallel_workers=8); SELECT SUM(NULL::istore) FROM data; sum ----- (1 row) SELECT SUM(data) FROM data; sum ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- "1"=>"546136500", "2"=>"546227500", "3"=>"546318500", "4"=>"546409500", "5"=>"546500500", "6"=>"546591500", "7"=>"546682500", "8"=>"546773500", "9"=>"546864500", "10"=>"546955500" (1 row) EXPLAIN(COSTS OFF) SELECT SUM(data) FROM data; QUERY PLAN --------------------------------------------- Finalize Aggregate -> Gather Workers Planned: 8 -> Partial Aggregate -> Parallel Seq Scan on data (5 rows) SELECT id, SUM(data) FROM data GROUP BY id ORDER BY id LIMIT 10; id | sum ------+----------------------------------------------------------------------------------------------------------------------------------------------------------------- 1000 | "1"=>"1501500", "2"=>"1502500", "3"=>"1503500", "4"=>"1504500", "5"=>"1505500", "6"=>"1506500", "7"=>"1507500", "8"=>"1508500", "9"=>"1509500", "10"=>"1510500" 1100 | "1"=>"1601500", "2"=>"1602500", "3"=>"1603500", "4"=>"1604500", "5"=>"1605500", "6"=>"1606500", "7"=>"1607500", "8"=>"1608500", "9"=>"1609500", "10"=>"1610500" 1200 | "1"=>"1701500", "2"=>"1702500", "3"=>"1703500", "4"=>"1704500", "5"=>"1705500", "6"=>"1706500", "7"=>"1707500", "8"=>"1708500", "9"=>"1709500", "10"=>"1710500" 1300 | "1"=>"1801500", "2"=>"1802500", "3"=>"1803500", "4"=>"1804500", "5"=>"1805500", "6"=>"1806500", "7"=>"1807500", "8"=>"1808500", "9"=>"1809500", "10"=>"1810500" 1400 | "1"=>"1901500", "2"=>"1902500", "3"=>"1903500", "4"=>"1904500", "5"=>"1905500", "6"=>"1906500", "7"=>"1907500", "8"=>"1908500", "9"=>"1909500", "10"=>"1910500" 1500 | "1"=>"2001500", "2"=>"2002500", "3"=>"2003500", "4"=>"2004500", "5"=>"2005500", "6"=>"2006500", "7"=>"2007500", "8"=>"2008500", "9"=>"2009500", "10"=>"2010500" 1600 | "1"=>"2101500", "2"=>"2102500", "3"=>"2103500", "4"=>"2104500", "5"=>"2105500", "6"=>"2106500", "7"=>"2107500", "8"=>"2108500", "9"=>"2109500", "10"=>"2110500" 1700 | "1"=>"2201500", "2"=>"2202500", "3"=>"2203500", "4"=>"2204500", "5"=>"2205500", "6"=>"2206500", "7"=>"2207500", "8"=>"2208500", "9"=>"2209500", "10"=>"2210500" 1800 | "1"=>"2301500", "2"=>"2302500", "3"=>"2303500", "4"=>"2304500", "5"=>"2305500", "6"=>"2306500", "7"=>"2307500", "8"=>"2308500", "9"=>"2309500", "10"=>"2310500" 1900 | "1"=>"2401500", "2"=>"2402500", "3"=>"2403500", "4"=>"2404500", "5"=>"2405500", "6"=>"2406500", "7"=>"2407500", "8"=>"2408500", "9"=>"2409500", "10"=>"2410500" (10 rows) EXPLAIN(COSTS OFF) SELECT id, SUM(data) FROM data GROUP BY id ORDER BY id; QUERY PLAN --------------------------------------------------- Sort Sort Key: id -> Finalize HashAggregate Group Key: id -> Gather Workers Planned: 8 -> Partial HashAggregate Group Key: id -> Parallel Seq Scan on data (9 rows) SELECT MIN(data) FROM data; min ----------------------------------------------------------------------------------------------------------------------------------- "1"=>"1002", "2"=>"1003", "3"=>"1004", "4"=>"1005", "5"=>"1006", "6"=>"1007", "7"=>"1008", "8"=>"1009", "9"=>"1010", "10"=>"1011" (1 row) EXPLAIN(COSTS OFF) SELECT MIN(data) FROM data; QUERY PLAN --------------------------------------------- Finalize Aggregate -> Gather Workers Planned: 8 -> Partial Aggregate -> Parallel Seq Scan on data (5 rows) SELECT id, MIN(data) FROM data GROUP BY id ORDER BY id LIMIT 10; id | min ------+----------------------------------------------------------------------------------------------------------------------------------- 1000 | "1"=>"1002", "2"=>"1003", "3"=>"1004", "4"=>"1005", "5"=>"1006", "6"=>"1007", "7"=>"1008", "8"=>"1009", "9"=>"1010", "10"=>"1011" 1100 | "1"=>"1102", "2"=>"1103", "3"=>"1104", "4"=>"1105", "5"=>"1106", "6"=>"1107", "7"=>"1108", "8"=>"1109", "9"=>"1110", "10"=>"1111" 1200 | "1"=>"1202", "2"=>"1203", "3"=>"1204", "4"=>"1205", "5"=>"1206", "6"=>"1207", "7"=>"1208", "8"=>"1209", "9"=>"1210", "10"=>"1211" 1300 | "1"=>"1302", "2"=>"1303", "3"=>"1304", "4"=>"1305", "5"=>"1306", "6"=>"1307", "7"=>"1308", "8"=>"1309", "9"=>"1310", "10"=>"1311" 1400 | "1"=>"1402", "2"=>"1403", "3"=>"1404", "4"=>"1405", "5"=>"1406", "6"=>"1407", "7"=>"1408", "8"=>"1409", "9"=>"1410", "10"=>"1411" 1500 | "1"=>"1502", "2"=>"1503", "3"=>"1504", "4"=>"1505", "5"=>"1506", "6"=>"1507", "7"=>"1508", "8"=>"1509", "9"=>"1510", "10"=>"1511" 1600 | "1"=>"1602", "2"=>"1603", "3"=>"1604", "4"=>"1605", "5"=>"1606", "6"=>"1607", "7"=>"1608", "8"=>"1609", "9"=>"1610", "10"=>"1611" 1700 | "1"=>"1702", "2"=>"1703", "3"=>"1704", "4"=>"1705", "5"=>"1706", "6"=>"1707", "7"=>"1708", "8"=>"1709", "9"=>"1710", "10"=>"1711" 1800 | "1"=>"1802", "2"=>"1803", "3"=>"1804", "4"=>"1805", "5"=>"1806", "6"=>"1807", "7"=>"1808", "8"=>"1809", "9"=>"1810", "10"=>"1811" 1900 | "1"=>"1902", "2"=>"1903", "3"=>"1904", "4"=>"1905", "5"=>"1906", "6"=>"1907", "7"=>"1908", "8"=>"1909", "9"=>"1910", "10"=>"1911" (10 rows) EXPLAIN(COSTS OFF) SELECT id, MIN(data) FROM data GROUP BY id ORDER BY id; QUERY PLAN --------------------------------------------------- Sort Sort Key: id -> Finalize HashAggregate Group Key: id -> Gather Workers Planned: 8 -> Partial HashAggregate Group Key: id -> Parallel Seq Scan on data (9 rows) SELECT MAX(data) FROM data; max --------------------------------------------------------------------------------------------------------------------------------------------- "1"=>"11001", "2"=>"11002", "3"=>"11003", "4"=>"11004", "5"=>"11005", "6"=>"11006", "7"=>"11007", "8"=>"11008", "9"=>"11009", "10"=>"11010" (1 row) EXPLAIN(COSTS OFF) SELECT MAX(data) FROM data; QUERY PLAN --------------------------------------------- Finalize Aggregate -> Gather Workers Planned: 8 -> Partial Aggregate -> Parallel Seq Scan on data (5 rows) SELECT id, MAX(data) FROM data GROUP BY id ORDER BY id LIMIT 10; id | max ------+----------------------------------------------------------------------------------------------------------------------------------- 1000 | "1"=>"2001", "2"=>"2002", "3"=>"2003", "4"=>"2004", "5"=>"2005", "6"=>"2006", "7"=>"2007", "8"=>"2008", "9"=>"2009", "10"=>"2010" 1100 | "1"=>"2101", "2"=>"2102", "3"=>"2103", "4"=>"2104", "5"=>"2105", "6"=>"2106", "7"=>"2107", "8"=>"2108", "9"=>"2109", "10"=>"2110" 1200 | "1"=>"2201", "2"=>"2202", "3"=>"2203", "4"=>"2204", "5"=>"2205", "6"=>"2206", "7"=>"2207", "8"=>"2208", "9"=>"2209", "10"=>"2210" 1300 | "1"=>"2301", "2"=>"2302", "3"=>"2303", "4"=>"2304", "5"=>"2305", "6"=>"2306", "7"=>"2307", "8"=>"2308", "9"=>"2309", "10"=>"2310" 1400 | "1"=>"2401", "2"=>"2402", "3"=>"2403", "4"=>"2404", "5"=>"2405", "6"=>"2406", "7"=>"2407", "8"=>"2408", "9"=>"2409", "10"=>"2410" 1500 | "1"=>"2501", "2"=>"2502", "3"=>"2503", "4"=>"2504", "5"=>"2505", "6"=>"2506", "7"=>"2507", "8"=>"2508", "9"=>"2509", "10"=>"2510" 1600 | "1"=>"2601", "2"=>"2602", "3"=>"2603", "4"=>"2604", "5"=>"2605", "6"=>"2606", "7"=>"2607", "8"=>"2608", "9"=>"2609", "10"=>"2610" 1700 | "1"=>"2701", "2"=>"2702", "3"=>"2703", "4"=>"2704", "5"=>"2705", "6"=>"2706", "7"=>"2707", "8"=>"2708", "9"=>"2709", "10"=>"2710" 1800 | "1"=>"2801", "2"=>"2802", "3"=>"2803", "4"=>"2804", "5"=>"2805", "6"=>"2806", "7"=>"2807", "8"=>"2808", "9"=>"2809", "10"=>"2810" 1900 | "1"=>"2901", "2"=>"2902", "3"=>"2903", "4"=>"2904", "5"=>"2905", "6"=>"2906", "7"=>"2907", "8"=>"2908", "9"=>"2909", "10"=>"2910" (10 rows) EXPLAIN(COSTS OFF) SELECT id, MAX(data) FROM data GROUP BY id ORDER BY id; QUERY PLAN --------------------------------------------------- Sort Sort Key: id -> Finalize HashAggregate Group Key: id -> Gather Workers Planned: 8 -> Partial HashAggregate Group Key: id -> Parallel Seq Scan on data (9 rows) CREATE TABLE bigdata AS SELECT id, isagg(k, (id+dup+k)::bigint) as data FROM generate_series(1000,10000, 100) id, generate_series(1,10) k, generate_series(1,1000) dup GROUP BY id, dup ORDER BY id; ALTER TABLE bigdata set (parallel_workers=8); SELECT SUM(data) FROM bigdata; sum ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- "1"=>"546136500", "2"=>"546227500", "3"=>"546318500", "4"=>"546409500", "5"=>"546500500", "6"=>"546591500", "7"=>"546682500", "8"=>"546773500", "9"=>"546864500", "10"=>"546955500" (1 row) EXPLAIN(COSTS OFF) SELECT SUM(data) FROM bigdata; QUERY PLAN ------------------------------------------------ Finalize Aggregate -> Gather Workers Planned: 8 -> Partial Aggregate -> Parallel Seq Scan on bigdata (5 rows) SELECT id, SUM(data) FROM bigdata GROUP BY id ORDER BY id LIMIT 10; id | sum ------+----------------------------------------------------------------------------------------------------------------------------------------------------------------- 1000 | "1"=>"1501500", "2"=>"1502500", "3"=>"1503500", "4"=>"1504500", "5"=>"1505500", "6"=>"1506500", "7"=>"1507500", "8"=>"1508500", "9"=>"1509500", "10"=>"1510500" 1100 | "1"=>"1601500", "2"=>"1602500", "3"=>"1603500", "4"=>"1604500", "5"=>"1605500", "6"=>"1606500", "7"=>"1607500", "8"=>"1608500", "9"=>"1609500", "10"=>"1610500" 1200 | "1"=>"1701500", "2"=>"1702500", "3"=>"1703500", "4"=>"1704500", "5"=>"1705500", "6"=>"1706500", "7"=>"1707500", "8"=>"1708500", "9"=>"1709500", "10"=>"1710500" 1300 | "1"=>"1801500", "2"=>"1802500", "3"=>"1803500", "4"=>"1804500", "5"=>"1805500", "6"=>"1806500", "7"=>"1807500", "8"=>"1808500", "9"=>"1809500", "10"=>"1810500" 1400 | "1"=>"1901500", "2"=>"1902500", "3"=>"1903500", "4"=>"1904500", "5"=>"1905500", "6"=>"1906500", "7"=>"1907500", "8"=>"1908500", "9"=>"1909500", "10"=>"1910500" 1500 | "1"=>"2001500", "2"=>"2002500", "3"=>"2003500", "4"=>"2004500", "5"=>"2005500", "6"=>"2006500", "7"=>"2007500", "8"=>"2008500", "9"=>"2009500", "10"=>"2010500" 1600 | "1"=>"2101500", "2"=>"2102500", "3"=>"2103500", "4"=>"2104500", "5"=>"2105500", "6"=>"2106500", "7"=>"2107500", "8"=>"2108500", "9"=>"2109500", "10"=>"2110500" 1700 | "1"=>"2201500", "2"=>"2202500", "3"=>"2203500", "4"=>"2204500", "5"=>"2205500", "6"=>"2206500", "7"=>"2207500", "8"=>"2208500", "9"=>"2209500", "10"=>"2210500" 1800 | "1"=>"2301500", "2"=>"2302500", "3"=>"2303500", "4"=>"2304500", "5"=>"2305500", "6"=>"2306500", "7"=>"2307500", "8"=>"2308500", "9"=>"2309500", "10"=>"2310500" 1900 | "1"=>"2401500", "2"=>"2402500", "3"=>"2403500", "4"=>"2404500", "5"=>"2405500", "6"=>"2406500", "7"=>"2407500", "8"=>"2408500", "9"=>"2409500", "10"=>"2410500" (10 rows) EXPLAIN(COSTS OFF) SELECT id, SUM(data) FROM bigdata GROUP BY id ORDER BY id; QUERY PLAN ------------------------------------------------------ Sort Sort Key: id -> Finalize HashAggregate Group Key: id -> Gather Workers Planned: 8 -> Partial HashAggregate Group Key: id -> Parallel Seq Scan on bigdata (9 rows) SELECT MIN(data) FROM bigdata; min ----------------------------------------------------------------------------------------------------------------------------------- "1"=>"1002", "2"=>"1003", "3"=>"1004", "4"=>"1005", "5"=>"1006", "6"=>"1007", "7"=>"1008", "8"=>"1009", "9"=>"1010", "10"=>"1011" (1 row) EXPLAIN(COSTS OFF) SELECT MIN(data) FROM bigdata; QUERY PLAN ------------------------------------------------ Finalize Aggregate -> Gather Workers Planned: 8 -> Partial Aggregate -> Parallel Seq Scan on bigdata (5 rows) SELECT id, MIN(data) FROM bigdata GROUP BY id ORDER BY id LIMIT 10; id | min ------+----------------------------------------------------------------------------------------------------------------------------------- 1000 | "1"=>"1002", "2"=>"1003", "3"=>"1004", "4"=>"1005", "5"=>"1006", "6"=>"1007", "7"=>"1008", "8"=>"1009", "9"=>"1010", "10"=>"1011" 1100 | "1"=>"1102", "2"=>"1103", "3"=>"1104", "4"=>"1105", "5"=>"1106", "6"=>"1107", "7"=>"1108", "8"=>"1109", "9"=>"1110", "10"=>"1111" 1200 | "1"=>"1202", "2"=>"1203", "3"=>"1204", "4"=>"1205", "5"=>"1206", "6"=>"1207", "7"=>"1208", "8"=>"1209", "9"=>"1210", "10"=>"1211" 1300 | "1"=>"1302", "2"=>"1303", "3"=>"1304", "4"=>"1305", "5"=>"1306", "6"=>"1307", "7"=>"1308", "8"=>"1309", "9"=>"1310", "10"=>"1311" 1400 | "1"=>"1402", "2"=>"1403", "3"=>"1404", "4"=>"1405", "5"=>"1406", "6"=>"1407", "7"=>"1408", "8"=>"1409", "9"=>"1410", "10"=>"1411" 1500 | "1"=>"1502", "2"=>"1503", "3"=>"1504", "4"=>"1505", "5"=>"1506", "6"=>"1507", "7"=>"1508", "8"=>"1509", "9"=>"1510", "10"=>"1511" 1600 | "1"=>"1602", "2"=>"1603", "3"=>"1604", "4"=>"1605", "5"=>"1606", "6"=>"1607", "7"=>"1608", "8"=>"1609", "9"=>"1610", "10"=>"1611" 1700 | "1"=>"1702", "2"=>"1703", "3"=>"1704", "4"=>"1705", "5"=>"1706", "6"=>"1707", "7"=>"1708", "8"=>"1709", "9"=>"1710", "10"=>"1711" 1800 | "1"=>"1802", "2"=>"1803", "3"=>"1804", "4"=>"1805", "5"=>"1806", "6"=>"1807", "7"=>"1808", "8"=>"1809", "9"=>"1810", "10"=>"1811" 1900 | "1"=>"1902", "2"=>"1903", "3"=>"1904", "4"=>"1905", "5"=>"1906", "6"=>"1907", "7"=>"1908", "8"=>"1909", "9"=>"1910", "10"=>"1911" (10 rows) EXPLAIN(COSTS OFF) SELECT id, MIN(data) FROM bigdata GROUP BY id ORDER BY id; QUERY PLAN ------------------------------------------------------ Sort Sort Key: id -> Finalize HashAggregate Group Key: id -> Gather Workers Planned: 8 -> Partial HashAggregate Group Key: id -> Parallel Seq Scan on bigdata (9 rows) SELECT MAX(data) FROM bigdata; max --------------------------------------------------------------------------------------------------------------------------------------------- "1"=>"11001", "2"=>"11002", "3"=>"11003", "4"=>"11004", "5"=>"11005", "6"=>"11006", "7"=>"11007", "8"=>"11008", "9"=>"11009", "10"=>"11010" (1 row) EXPLAIN(COSTS OFF) SELECT MAX(data) FROM bigdata; QUERY PLAN ------------------------------------------------ Finalize Aggregate -> Gather Workers Planned: 8 -> Partial Aggregate -> Parallel Seq Scan on bigdata (5 rows) SELECT id, MAX(data) FROM bigdata GROUP BY id ORDER BY id LIMIT 10; id | max ------+----------------------------------------------------------------------------------------------------------------------------------- 1000 | "1"=>"2001", "2"=>"2002", "3"=>"2003", "4"=>"2004", "5"=>"2005", "6"=>"2006", "7"=>"2007", "8"=>"2008", "9"=>"2009", "10"=>"2010" 1100 | "1"=>"2101", "2"=>"2102", "3"=>"2103", "4"=>"2104", "5"=>"2105", "6"=>"2106", "7"=>"2107", "8"=>"2108", "9"=>"2109", "10"=>"2110" 1200 | "1"=>"2201", "2"=>"2202", "3"=>"2203", "4"=>"2204", "5"=>"2205", "6"=>"2206", "7"=>"2207", "8"=>"2208", "9"=>"2209", "10"=>"2210" 1300 | "1"=>"2301", "2"=>"2302", "3"=>"2303", "4"=>"2304", "5"=>"2305", "6"=>"2306", "7"=>"2307", "8"=>"2308", "9"=>"2309", "10"=>"2310" 1400 | "1"=>"2401", "2"=>"2402", "3"=>"2403", "4"=>"2404", "5"=>"2405", "6"=>"2406", "7"=>"2407", "8"=>"2408", "9"=>"2409", "10"=>"2410" 1500 | "1"=>"2501", "2"=>"2502", "3"=>"2503", "4"=>"2504", "5"=>"2505", "6"=>"2506", "7"=>"2507", "8"=>"2508", "9"=>"2509", "10"=>"2510" 1600 | "1"=>"2601", "2"=>"2602", "3"=>"2603", "4"=>"2604", "5"=>"2605", "6"=>"2606", "7"=>"2607", "8"=>"2608", "9"=>"2609", "10"=>"2610" 1700 | "1"=>"2701", "2"=>"2702", "3"=>"2703", "4"=>"2704", "5"=>"2705", "6"=>"2706", "7"=>"2707", "8"=>"2708", "9"=>"2709", "10"=>"2710" 1800 | "1"=>"2801", "2"=>"2802", "3"=>"2803", "4"=>"2804", "5"=>"2805", "6"=>"2806", "7"=>"2807", "8"=>"2808", "9"=>"2809", "10"=>"2810" 1900 | "1"=>"2901", "2"=>"2902", "3"=>"2903", "4"=>"2904", "5"=>"2905", "6"=>"2906", "7"=>"2907", "8"=>"2908", "9"=>"2909", "10"=>"2910" (10 rows) EXPLAIN(COSTS OFF) SELECT id, MAX(data) FROM bigdata GROUP BY id ORDER BY id; QUERY PLAN ------------------------------------------------------ Sort Sort Key: id -> Finalize HashAggregate Group Key: id -> Gather Workers Planned: 8 -> Partial HashAggregate Group Key: id -> Parallel Seq Scan on bigdata (9 rows) -- sanity checks SELECT SUM(data->5) FROM data; sum ----------- 546500500 (1 row) SELECT id, SUM(data->5) FROM data GROUP BY id ORDER BY id LIMIT 10; id | sum ------+--------- 1000 | 1505500 1100 | 1605500 1200 | 1705500 1300 | 1805500 1400 | 1905500 1500 | 2005500 1600 | 2105500 1700 | 2205500 1800 | 2305500 1900 | 2405500 (10 rows) SELECT MIN(data->5) FROM data; min ------ 1006 (1 row) SELECT id, MIN(data->5) FROM data GROUP BY id ORDER BY id LIMIT 10; id | min ------+------ 1000 | 1006 1100 | 1106 1200 | 1206 1300 | 1306 1400 | 1406 1500 | 1506 1600 | 1606 1700 | 1706 1800 | 1806 1900 | 1906 (10 rows) SELECT MAX(data->5) FROM data; max ------- 11005 (1 row) SELECT id, MAX(data->5) FROM data GROUP BY id ORDER BY id LIMIT 10; id | max ------+------ 1000 | 2005 1100 | 2105 1200 | 2205 1300 | 2305 1400 | 2405 1500 | 2505 1600 | 2605 1700 | 2705 1800 | 2805 1900 | 2905 (10 rows) SELECT SUM(data->5) FROM bigdata; sum ----------- 546500500 (1 row) SELECT id, SUM(data->5) FROM bigdata GROUP BY id ORDER BY id LIMIT 10; id | sum ------+--------- 1000 | 1505500 1100 | 1605500 1200 | 1705500 1300 | 1805500 1400 | 1905500 1500 | 2005500 1600 | 2105500 1700 | 2205500 1800 | 2305500 1900 | 2405500 (10 rows) SELECT MIN(data->5) FROM bigdata; min ------ 1006 (1 row) SELECT id, MIN(data->5) FROM bigdata GROUP BY id ORDER BY id LIMIT 10; id | min ------+------ 1000 | 1006 1100 | 1106 1200 | 1206 1300 | 1306 1400 | 1406 1500 | 1506 1600 | 1606 1700 | 1706 1800 | 1806 1900 | 1906 (10 rows) SELECT MAX(data->5) FROM bigdata; max ------- 11005 (1 row) SELECT id, MAX(data->5) FROM bigdata GROUP BY id ORDER BY id LIMIT 10; id | max ------+------ 1000 | 2005 1100 | 2105 1200 | 2205 1300 | 2305 1400 | 2405 1500 | 2505 1600 | 2605 1700 | 2705 1800 | 2805 1900 | 2905 (10 rows)