-- One merge reads at most sift.test_merge_max_kb of segments (16 GB): its output stays within what a -- segment header can list, whatever sift.merge(index, true) was asked. Segments past the cap stay. CREATE EXTENSION pg_sift; CREATE EXTENSION pg_sift_test; SET sift.async_maintenance = off; SET enable_seqscan = off; CREATE TABLE mc (id serial, body text) WITH (autovacuum_enabled = off); CREATE INDEX mc_idx ON mc USING sift (body); -- 10 segments of about 112 kB DO $$ BEGIN FOR i IN 1..10 LOOP INSERT INTO mc (body) SELECT 'common g' || i || ' ' || string_agg(md5((i * 1000 + g * 7 + j)::text), ' ') FROM generate_series(1, 400) g, generate_series(1, 6) j GROUP BY g; PERFORM sift.promote('mc_idx'); COMMIT; END LOOP; END $$; SELECT count(*) AS segments, min(bytes) BETWEEN 100000 AND 130000 AS about_112kb FROM sift.segments('mc_idx') WHERE kind = 'immutable'; segments | about_112kb ----------+------------- 10 | t (1 row) SET sift.test_merge_max_kb = 500; SELECT sift.merge('mc_idx', true) >= 1 AS merged; merged -------- t (1 row) SELECT sift.merge('mc_idx', true) >= 0 AS merged_more; merged_more ------------- t (1 row) SELECT count(*) > 1 AS in_pieces, max(bytes) <= 500 * 1024 AS within_cap FROM sift.segments('mc_idx') WHERE kind = 'immutable'; in_pieces | within_cap -----------+------------ t | t (1 row) SELECT count(*) FROM mc WHERE body @@> 'common'; count ------- 4000 (1 row) SELECT count(*) FROM mc WHERE body @@> 'g7'; count ------- 400 (1 row) SELECT sift.verify('mc_idx', true); verify -------- (1 row) RESET sift.test_merge_max_kb; SELECT sift.merge('mc_idx', true) >= 1 AS merged; merged -------- t (1 row) SELECT count(*) AS segments FROM sift.segments('mc_idx') WHERE kind = 'immutable'; segments ---------- 1 (1 row) SELECT count(*) FROM mc WHERE body @@> 'common'; count ------- 4000 (1 row) SELECT sift.verify('mc_idx', true); verify -------- (1 row) DROP TABLE mc; DROP EXTENSION pg_sift_test; DROP EXTENSION pg_sift;