It looks like you want to refresh the materialized views whenever the data in the tables change. If you do that with materialized views, it will take a long time, and updates will block each other and queries.
Maybe you can build your own “on commit refresh” materialized views as tables.
A simple example:
Instead of
CREATE MATERIALIZED VIEW sum_eumel AS
SELECT eumel_category,
sum(eumel_data) AS eumel_sum
FROM eumel
GROUP BY eumel_category;
you could do this:
BEGIN;
CREATE TABLE sum_eumel (
eumel_category text NOT NULL PRIMARY KEY,
eumel_sum bigint NOT NULL DEFAULT 0
);
BEGIN;
CREATE FUNCTION eumel_trigger() RETURNS trigger
LANGUAGE plpgsql AS
$$BEGIN
IF TG_OP IN ('UPDATE', 'DELETE') THEN
/*
* Will leave rows with value 0 after the last
* row for a category has been deleted.
*/
UPDATE sum_eumel
SET eumel_sum = eumel_sum - OLD.eumel_data
WHERE eumel_category = OLD.eumel_category;
END IF;
IF TG_OP IN ('INSERT', 'UPDATE') THEN
INSERT INTO sum_eumel (eumel_category, eumel_sum)
VALUES (NEW.eumel_category, NEW.eumel_data)
ON CONFLICT TO UPDATE
SET eumel_sum = sum_eumel.eumel_sum + EXCLUDED.eumel_data
END IF;
IF TG_OP = 'TRUNCATE' THEN
TRUNCATE sum_eumel;
RETURN NULL;
END IF;
IF TG_OP = 'DELETE' THEN
RETURN OLD;
ELSE
RETURN NEW;
END IF;
END;$$;
CREATE TRIGGER eumel_dml_trig
AFTER INSERT OR UPDATE OR DELETE ON eumel
FOR EACH ROW EXECUTE PROCEDURE eumel_trigger();
CREATE TRIGGER eumel_truncate_trig
AFTER TRUNCATE ON eumel
FOR EACH STATEMENT EXECUTE PROCEDURE eumel_trigger();
INSERT INTO sum_eumel
SELECT eumel_category,
sum(eumel_data) AS eumel_sum
FROM eumel
GROUP BY eumel_category;
COMMIT;