PG configurations ======================= shared_buffers = 2GB checkpoint_timeout = 30min max_wal_size = 20GB min_wal_size = 10GB autovacuum = off Steps ======================= As Andres suggested in mail [1]. [1] https://www.postgresql.org/message-id/20220203182922.344fhhqzjp2ah6yp%40alap3.anarazel.de Details - workload "a" ======================= CREATE TABLE test (key int, value text, data jsonb, PRIMARY KEY(key, value)); CREATE PUBLICATION pub_1 FOR TABLE test; CREATE PUBLICATION pub_1 FOR TABLE test WHERE (key > 0); -- 100% allowed CREATE PUBLICATION pub_1 FOR TABLE test WHERE (key > 250000); -- 75% allowed CREATE PUBLICATION pub_1 FOR TABLE test WHERE (key > 500000); -- 50% allowed CREATE PUBLICATION pub_1 FOR TABLE test WHERE (key > 750000); -- 25% allowed CREATE PUBLICATION pub_1 FOR TABLE test WHERE (key > 1000000); -- 0% allowed INSERT INTO test SELECT i, i::text, row_to_json(row(i)) FROM generate_series(1,1000001)i; Details - workload "b" ====================== CREATE TABLE test (key int, value text, data jsonb, PRIMARY KEY(key, value)); CREATE PUBLICATION pub_1 FOR TABLE test; CREATE PUBLICATION pub_1 FOR TABLE test WHERE (key > 0); -- 100% allowed CREATE PUBLICATION pub_1 FOR TABLE test WHERE (key > 250000); -- 75% allowed CREATE PUBLICATION pub_1 FOR TABLE test WHERE (key > 500000); -- 50% allowed CREATE PUBLICATION pub_1 FOR TABLE test WHERE (key > 750000); -- 25% allowed CREATE PUBLICATION pub_1 FOR TABLE test WHERE (key > 1000000); -- 0% allowed DO $do$ BEGIN FOR i IN 0..1000001 BY 10 LOOP INSERT INTO test VALUES(i,'BAH', row_to_json(row(i))); UPDATE test SET value = 'FOO' WHERE key = i; IF I % 1000 = 0 THEN COMMIT; END IF; END LOOP; END $do$; Details - workload "c" ====================== CREATE TABLE test1 (key int, value text, data jsonb, PRIMARY KEY(key, value)); CREATE TABLE test2 (key int, value text, data jsonb, PRIMARY KEY(key, value)); CREATE TABLE test3 (key int, value text, data jsonb, PRIMARY KEY(key, value)); CREATE TABLE test4 (key int, value text, data jsonb, PRIMARY KEY(key, value)); CREATE TABLE test5 (key int, value text, data jsonb, PRIMARY KEY(key, value)); CREATE PUBLICATION pub_1 FOR TABLE test1, test2, test3, test4, test5; CREATE PUBLICATION pub_1 FOR TABLE test1 WHERE (key > 0), test2 WHERE (key > 0), test3 WHERE (key > 0), test4 WHERE (key > 0), test5 WHERE (key > 0); CREATE PUBLICATION pub_1 FOR TABLE test1 WHERE (key > 250000), test2 WHERE (key > 250000), test3 WHERE (key > 250000), test4 WHERE (key > 250000), test5 WHERE (key > 250000); CREATE PUBLICATION pub_1 FOR TABLE test1 WHERE (key > 500000), test2 WHERE (key > 500000), test3 WHERE (key > 500000), test4 WHERE (key > 500000), test5 WHERE (key > 500000); CREATE PUBLICATION pub_1 FOR TABLE test1 WHERE (key > 750000), test2 WHERE (key > 750000), test3 WHERE (key > 750000), test4 WHERE (key > 750000), test5 WHERE (key > 750000); CREATE PUBLICATION pub_1 FOR TABLE test1 WHERE (key > 1000000), test2 WHERE (key > 1000000), test3 WHERE (key > 1000000), test4 WHERE (key > 1000000), test5 WHERE (key > 1000000); DO $do$ BEGIN FOR i IN 0..1000001 BY 10 LOOP -- test1 INSERT INTO test1 VALUES(i,'BAH', row_to_json(row(i))); UPDATE test1 SET value = 'FOO' WHERE key = i; -- test2 INSERT INTO test2 VALUES(i,'BAH', row_to_json(row(i))); UPDATE test2 SET value = 'FOO' WHERE key = i; -- test3 INSERT INTO test3 VALUES(i,'BAH', row_to_json(row(i))); UPDATE test3 SET value = 'FOO' WHERE key = i; -- test4 INSERT INTO test4 VALUES(i,'BAH', row_to_json(row(i))); UPDATE test4 SET value = 'FOO' WHERE key = i; -- test5 INSERT INTO test5 VALUES(i,'BAH', row_to_json(row(i))); UPDATE test5 SET value = 'FOO' WHERE key = i; IF I % 1000 = 0 THEN -- raise notice 'commit: %', i; COMMIT; END IF; END LOOP; END $do$; Details - workload "d" ====================== CREATE TABLE test (key int, value text, value1 text, data jsonb, PRIMARY KEY(key, value)); CREATE PUBLICATION pub_1 FOR TABLE test; CREATE PUBLICATION pub_1 FOR TABLE test WHERE (key > 0); -- 100% allowed CREATE PUBLICATION pub_1 FOR TABLE test WHERE (key > 250000); -- 75% allowed CREATE PUBLICATION pub_1 FOR TABLE test WHERE (key > 500000); -- 50% allowed CREATE PUBLICATION pub_1 FOR TABLE test WHERE (key > 750000); -- 25% allowed CREATE PUBLICATION pub_1 FOR TABLE test WHERE (key > 1000000); -- 0% allowed DO $do$ BEGIN FOR i IN 0..1000000 BY 500 LOOP ALTER TABLE test ALTER COLUMN value1 TYPE varchar(30); INSERT INTO test VALUES(i,'BAH','BAH', row_to_json(row(i))); ALTER TABLE test ALTER COLUMN value1 TYPE text; UPDATE test SET value = 'FOO' WHERE key = i; COMMIT; END LOOP; END $do$;