PostgreSQL 9.3 рдореЗрдВ рдЕрджреНрдпрддрди рдпреЛрдЧреНрдп рднреМрддрд┐рдХ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдЪрдпрди


рд╣реИрд▓реЛ, 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 рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреА рд╣реИ (рдХреНрд░реЙрди рдЬреЙрдм рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд):
 #!/bin/bash HOST="localhost" PORT="5432" USER="postgres" DATABASE="mydb" VIEWS=() VIEWS+=('public.mv_order') VIEWS+=('public.mv_delivery') VCOUNT=${#VIEWS[@]} for ((i = 0; i < ${VCOUNT}; i++)) do VIEW=${VIEWS[$i]} QUERY="SELECT public.swap_materialized_view('$VIEW')" if psql -h $HOST -p $PORT -U $USER -d $DATABASE -q -c "SET client_min_messages = ERROR; $QUERY">/dev/null 1>&1; then logger -p cron.notice -t update_mv Updated materialized view $VIEW else logger -p cron.notice -t update_mv Can\'t update materialized view $VIEW fi done 

рдФрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреНрд░реЛрди рдХрд╛рд░реНрдп рдЦреБрдж (fcron рдХреЗ рд▓рд┐рдП) - рдПрдХ рдШрдВрдЯреЗ рдореЗрдВ рдПрдХ рдмрд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛:
 @mail(false),runatreboot(true) 1h update_mv 

рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
 SELECT public.create_materialized_view ( 'public.mv_order', 'public.vw_order' ); -- public.vw_order -  SELECT public.create_materialized_view ( 'public.mv_delivery, 'public.vw_delivery' ); -- public.vw_delivery -  SELECT public.create_materialized_view_index ( 'public.mv_order', 'idx_mv_order_purchase', '{purchaser_name,order_date}'::text[] ); 


Source: https://habr.com/ru/post/In209952/


All Articles