title: Triggers to refresh multiple materialized views based on same table
body: <p>I have a spatial table in a Postgres database from which I create three separate materialized views (each based on specific spatial queries). I want to create trigger functions to refresh each of the materialized views on updates, inserts, and deletes.</p>
  
  <p>I have created three separate functions and triggers, but the performance (as to be expected) is horrendous. If I run a single trigger on update, insert, or delete, it performs fine. Below is a sample function and trigger I am using:</p>
  
  <pre><code>CREATE OR REPLACE FUNCTION refresh_mvw_taxa_hex5km()   
  RETURNS trigger 
  AS $BODY$ 
    BEGIN 
      refresh materialized view mvw_taxa_hex5km; 
      return new; 
    END; 
  $BODY$ LANGUAGE plpgsql; 
  
  
  CREATE TRIGGER refresh_mvw_taxa_hex5km   
  AFTER INSERT OR UPDATE OR DELETE ON occurrence   
  FOR EACH STATEMENT   
    EXECUTE PROCEDURE refresh_mvw_taxa_hex5km();
  </code></pre>
  
  <p>Is there a more efficient way to do this? I considered running scheduled tasks, but I really need the refresh on changes to the table. I have read a little about "concurrently," but not sure if this is the answer.</p>