init_parts.sql

application/sql

Filename: init_parts.sql
Type: application/sql
Part: 0
Message: Re: Optimize planner memory consumption for huge arrays
DROP FUNCTION IF EXISTS test_func;
DROP TABLE IF EXISTS parent CASCADE;

CREATE OR REPLACE FUNCTION test_func(x integer) RETURNS Integer[] AS $$
  SELECT array_agg(id) AS arr FROM generate_series(1, x, 1) AS id
$$ LANGUAGE SQL IMMUTABLE;

\set parts 100
CREATE TABLE parent (
  x integer,
  payload text
) PARTITION BY RANGE (x);

SELECT format('
			  CREATE TABLE part_%s
			  PARTITION OF parent
			  FOR VALUES FROM (%s) TO (%s);',
			  x, x, x+1)
FROM generate_series(1, :parts ,1) x
\gexec
ANALYZE parent;

\o out.txt
\echo PARTS: :parts
EXPLAIN (SUMMARY ON)
SELECT * FROM parent WHERE x = ANY (test_func(1));
EXPLAIN (SUMMARY ON)
SELECT * FROM parent WHERE x = ANY (test_func(10));
EXPLAIN (SUMMARY ON)
SELECT * FROM parent WHERE x = ANY (test_func(100));
EXPLAIN (SUMMARY ON)
SELECT * FROM parent WHERE x = ANY (test_func(1000));
EXPLAIN (SUMMARY ON)
SELECT * FROM parent WHERE x = ANY (test_func(10000));
\o

/*
SUMMARY:
========

master:
elems	1		1E1		1E2		1E3		1E4	
1		28kB	50kB	0.3MB	2.5MB	25MB
10		45kB	143kB	0.6MB	4.8MB	47MB
100		208kB	125kB	3.3MB	27MB	274MB

patched:
elems	1		1E1		1E2		1E3		1E4	
1		28kB	48kB	0.25MB	2.2MB	22.8MB
10		44kB	100kB	313kB	2.4MB	23.7MB
100		208kB	101kB	0.9MB	3.7MB	32.4MB
*/