How to refresh all materialized views in Postgresql 9.3 at once?

后端 未结 5 1690
青春惊慌失措
青春惊慌失措 2021-02-05 09:38

I am loading a bunch of data into a PostgresQL 9.3 database and then I want to refresh all materialized views that depend on the updated tables. Is there a way to do it automat

5条回答
  •  自闭症患者
    2021-02-05 09:58

    same method, added the option to run it on all schema's, optionally concurrently.

    CREATE OR REPLACE FUNCTION RefreshAllMaterializedViews(_schema TEXT DEFAULT '*', _concurrently BOOLEAN DEFAULT false)
    RETURNS INT AS $$
      DECLARE
        r RECORD;
      BEGIN
        RAISE NOTICE 'Refreshing materialized view(s) in % %', CASE WHEN _schema = '*' THEN ' all schemas' ELSE 'schema "'|| _schema || '"' END, CASE WHEN _concurrently THEN 'concurrently' ELSE '' END;
        IF pg_is_in_recovery() THEN 
          RETURN 0;
        ELSE    
          FOR r IN SELECT schemaname, matviewname FROM pg_matviews WHERE schemaname = _schema OR _schema = '*' 
          LOOP
            RAISE NOTICE 'Refreshing %.%', r.schemaname, r.matviewname;
            EXECUTE 'REFRESH MATERIALIZED VIEW ' || CASE WHEN _concurrently THEN 'CONCURRENTLY ' ELSE '' END || '"' || r.schemaname || '"."' || r.matviewname || '"'; 
          END LOOP;
        END IF;
        RETURN 1;
      END 
    $$ LANGUAGE plpgsql;
    

    I also put it on GitHub: https://github.com/frankhommers/RefreshAllMaterializedViews

提交回复
热议问题