Guest User

Untitled

a guest
Jul 17th, 2018
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.71 KB | None | 0 0
  1. CREATE OR REPLACE FUNCTION RefreshAllMaterializedViews(schema_arg TEXT DEFAULT 'public')
  2. RETURNS INT AS $$
  3. DECLARE
  4. r RECORD;
  5. BEGIN
  6. RAISE NOTICE 'Refreshing materialized view in schema %', schema_arg;
  7. FOR r IN SELECT matviewname FROM pg_matviews WHERE schemaname = schema_arg
  8. LOOP
  9. RAISE NOTICE 'Refreshing %.%', schema_arg, r.matviewname;
  10. EXECUTE 'REFRESH MATERIALIZED VIEW ' || schema_arg || '.' || r.matviewname;
  11. END LOOP;
  12.  
  13. RETURN 1;
  14. END
  15. $$ LANGUAGE plpgsql;
  16.  
  17. CREATE OR REPLACE FUNCTION RefreshAllMaterializedViews(_schema TEXT DEFAULT '*', _concurrently BOOLEAN DEFAULT false)
  18. RETURNS INT AS $$
  19. DECLARE
  20. r RECORD;
  21. BEGIN
  22. RAISE NOTICE 'Refreshing materialized view(s) in % %', CASE WHEN _schema = '*' THEN ' all schemas' ELSE 'schema "'|| _schema || '"' END, CASE WHEN _concurrently THEN 'concurrently' ELSE '' END;
  23. IF pg_is_in_recovery() THEN
  24. RETURN 0;
  25. ELSE
  26. FOR r IN SELECT schemaname, matviewname FROM pg_matviews WHERE schemaname = _schema OR _schema = '*'
  27. LOOP
  28. RAISE NOTICE 'Refreshing %.%', r.schemaname, r.matviewname;
  29. EXECUTE 'REFRESH MATERIALIZED VIEW ' || CASE WHEN _concurrently THEN 'CONCURRENTLY ' ELSE '' END || '"' || r.schemaname || '"."' || r.matviewname || '"';
  30. END LOOP;
  31. END IF;
  32. RETURN 1;
  33. END
  34. $$ LANGUAGE plpgsql;
  35.  
  36. CREATE OR REPLACE FUNCTION RefreshAllMaterializedViews(schema_arg TEXT DEFAULT 'public')
  37. RETURNS INT AS $$
  38. DECLARE
  39. r RECORD;
  40.  
  41. BEGIN
  42. RAISE NOTICE 'Refreshing materialized view in schema %', schema_arg;
  43. if pg_is_in_recovery() then
  44. return 1;
  45. else
  46. FOR r IN SELECT matviewname FROM pg_matviews WHERE schemaname = schema_arg
  47. LOOP
  48. RAISE NOTICE 'Refreshing %.%', schema_arg, r.matviewname;
  49. EXECUTE 'REFRESH MATERIALIZED VIEW ' || schema_arg || '.' || r.matviewname;
  50. END LOOP;
  51. end if;
  52. RETURN 1;
  53. END
  54. $$ LANGUAGE plpgsql;
  55.  
  56. CREATE OR REPLACE FUNCTION public.refresh_materialized_views(_schema text)
  57. RETURNS void
  58. AS
  59. $BODY$
  60. DECLARE
  61. refresh_sql text;
  62. BEGIN
  63.  
  64. WITH matviews AS (
  65. SELECT t.oid,
  66. relname AS view_name,
  67. nspname AS schema_name
  68. FROM pg_class t
  69. JOIN pg_catalog.pg_namespace n ON n.oid = t.relnamespace
  70. WHERE t.relkind = 'm'
  71. AND nspname NOT LIKE 'pg-%'
  72. AND nspname = _schema
  73. ), unique_indexes AS (
  74. SELECT m.oid,
  75. view_name,
  76. schema_name
  77. FROM pg_class i,
  78. pg_index ix,
  79. matviews m
  80. WHERE ix.indisunique = true
  81. AND ix.indexrelid = i.oid
  82. AND ix.indrelid = m.oid
  83. ), refresh_concurrently AS (
  84. SELECT 'REFRESH MATERIALIZED VIEW CONCURRENTLY ' || quote_ident(schema_name) || '.' || quote_ident(view_name) AS sql
  85. FROM unique_indexes
  86. ), refresh AS (
  87. SELECT 'REFRESH MATERIALIZED VIEW ' || quote_ident(schema_name) || '.' || quote_ident(view_name) AS sql
  88. FROM matviews
  89. WHERE oid != all (SELECT oid FROM unique_indexes)
  90. ), sql AS (
  91. SELECT sql FROM refresh_concurrently
  92. UNION ALL
  93. SELECT sql FROM refresh
  94. )
  95.  
  96. SELECT string_agg(sql, E';n') || E';n' FROM sql INTO refresh_sql;
  97.  
  98. EXECUTE refresh_sql;
  99.  
  100. END;
  101. $BODY$
  102. LANGUAGE plpgsql VOLATILE;
  103.  
  104. CREATE OR REPLACE VIEW mat_view_dependencies AS
  105. WITH RECURSIVE s(start_schemaname,start_mvname,schemaname,mvname,relkind,
  106. mvoid,depth) AS (
  107. -- List of mat views -- with no dependencies
  108. SELECT n.nspname AS start_schemaname, c.relname AS start_mvname,
  109. n.nspname AS schemaname, c.relname AS mvname, c.relkind,
  110. c.oid AS mvoid, 0 AS depth
  111. FROM pg_class c JOIN pg_namespace n ON c.relnamespace=n.oid
  112. WHERE c.relkind='m'
  113. UNION
  114. -- Recursively find all things depending on previous level
  115. SELECT s.start_schemaname, s.start_mvname,
  116. n.nspname AS schemaname, c.relname AS mvname,
  117. c.relkind,
  118. c.oid AS mvoid, depth+1 AS depth
  119. FROM s
  120. JOIN pg_depend d ON s.mvoid=d.refobjid
  121. JOIN pg_rewrite r ON d.objid=r.oid
  122. JOIN pg_class c ON r.ev_class=c.oid AND (c.relkind IN ('m','v'))
  123. JOIN pg_namespace n ON n.oid=c.relnamespace
  124. WHERE s.mvoid <> c.oid -- exclude the current MV which always depends on itself
  125. )
  126. SELECT * FROM s;
  127.  
  128. CREATE OR REPLACE VIEW mat_view_refresh_order AS
  129. WITH b AS (
  130. -- Select the highest depth of each mat view name
  131. SELECT DISTINCT ON (schemaname,mvname) schemaname, mvname, depth
  132. FROM mat_view_dependencies
  133. WHERE relkind='m'
  134. ORDER BY schemaname, mvname, depth DESC
  135. )
  136. -- Reorder appropriately
  137. SELECT schemaname, mvname, depth AS refresh_order
  138. FROM b
  139. ORDER BY depth, schemaname, mvname
  140. ;
  141.  
  142. WITH a AS (
  143. SELECT 'REFRESH MATERIALIZED VIEW "' || schemaname || '"."' || mvname || '";' AS r
  144. FROM mat_view_refresh_order
  145. ORDER BY refresh_order
  146. )
  147. SELECT string_agg(r,E'n') AS script FROM a gset
  148.  
  149. echo :script
  150. :script
Add Comment
Please, Sign In to add comment