
рд╣реИрд▓реЛ, habracheloveki! рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
PostgreSQL 9.3 рдореЗрдВ рд╢реБрд░реВ
рдХрд┐рдП рдЧрдП
рднреМрддрд┐рдХ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХрдорд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рджреГрд╢реНрдп рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдПрдХ рд╡рд┐рд╢реЗрд╖ (ACCESS EXCLUSIVE) рд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рджреГрд╢реНрдп рдХреЛ рдХреНрд╡реЗрд░реА рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
PostgreSQL 9.4 рдореЗрдВ, рдЗрд╕рдХреЗ рдЕрдкрдбреЗрдЯ рдХреЗ рджреМрд░рд╛рди рджреГрд╢реНрдп рд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА
рдпреЛрдЬрдирд╛ рд╣реИ ред рдЦреИрд░, рдЕрднреА рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдЫреЛрдЯреЗ рд╕реЗ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдХрд╛ рдПрдХ рд░рд╛рд╕реНрддрд╛ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдбрдмрд▓ рдмрдлрд╝рд░рд┐рдВрдЧ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧреАред рдЗрд╕рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рджреЛ рднреМрддрд┐рдХ рдирд┐рд░реВрдкрдг рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдПрдХ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬрдмрдХрд┐ рдЬрд┐рди рд╕рдВрд╕реНрдерд╛рдУрдВ рдкрд░ рдпрд╣ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдПрд╕реАрд╕реАрд╕ рд╢реЗрдпрд░ рдореЛрдб рдореЗрдВ рдЕрд╡рд░реБрджреНрдз рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рдЙрдирд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ), рдЖрдк рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдкрдбреЗрдЯ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡реИрдк рдХрд░реЗрдВред
рд╡рд┐рдЪрд╛рд░ рдмрдирд╛рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп:
CREATE OR REPLACE FUNCTION public.create_materialized_view ( p_viewname text, p_basename text ) RETURNS void AS $BODY$ BEGIN EXECUTE 'CREATE MATERIALIZED VIEW ' || p_viewname || ' AS SELECT * FROM ' || p_basename; EXECUTE 'CREATE MATERIALIZED VIEW ' || p_viewname || '_back AS SELECT * FROM ' || p_basename; END $BODY$ LANGUAGE plpgsql VOLATILE; CREATE OR REPLACE FUNCTION public.drop_materialized_view ( p_viewname text ) RETURNS void AS $BODY$ BEGIN EXECUTE 'DROP MATERIALIZED VIEW ' || p_viewname; EXECUTE 'DROP MATERIALIZED VIEW ' || p_viewname || '_back'; END $BODY$ LANGUAGE plpgsql VOLATILE;
рдмрдлрд╝рд░реНрд╕ рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд╛ рдХрд╛рд░реНрдп
рдмреИрдХ рдмрдлрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░
рд░рд╣рд╛ рд╣реИ рдФрд░
рдЖрдЧреЗ рдФрд░
рдкреАрдЫреЗ рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИред
CREATE OR REPLACE FUNCTION public.swap_materialized_view ( p_viewname text ) RETURNS void AS $BODY$ BEGIN EXECUTE 'REFRESH MATERIALIZED VIEW ' || p_viewname || '_back'; EXECUTE 'ALTER MATERIALIZED VIEW ' || p_viewname || ' RENAME TO ' || split_part ( p_viewname, '.', 2 ) || '_temp'; EXECUTE 'ALTER MATERIALIZED VIEW ' || p_viewname || '_back RENAME TO ' || split_part ( p_viewname, '.', 2 ); EXECUTE 'ALTER MATERIALIZED VIEW ' || p_viewname || '_temp RENAME TO ' || split_part ( p_viewname, '.', 2 ) || '_back'; END $BODY$ LANGUAGE plpgsql VOLATILE;
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдЪреЛрдЯ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреЗрдЧреА (рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ
рдмреИрдХ рдмрдлрд░ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛):
CREATE OR REPLACE FUNCTION public.create_materialized_view_index ( p_viewname text, p_indexname text, p_columns text[] ) RETURNS void AS $BODY$ BEGIN EXECUTE 'CREATE INDEX ' || p_indexname || ' ON ' || p_viewname || ' ( ' || array_to_string ( p_columns, ',' ) || ' )'; EXECUTE 'CREATE INDEX ' || p_indexname || '_back ON ' || p_viewname || '_back ( ' || array_to_string ( p_columns, ',' ) || ' )'; END $BODY$ LANGUAGE plpgsql VOLATILE;
рдЕрдкрдбреЗрдЯ_mv рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреА рд╣реИ (рдХреНрд░реЙрди рдЬреЙрдм рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд):
рдФрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреНрд░реЛрди рдХрд╛рд░реНрдп рдЦреБрдж (fcron рдХреЗ рд▓рд┐рдП) - рдПрдХ рдШрдВрдЯреЗ рдореЗрдВ рдПрдХ рдмрд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛:
@mail(false),runatreboot(true) 1h update_mv
рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
SELECT public.create_materialized_view ( 'public.mv_order', 'public.vw_order' );