定时任务
就像 @leonbloy 所说的。
此外,您还可以将定时任务放置在您的Postgres系统用户的crontab中,并简化调用:
psql mydb -c 'select maint.f_mv_update()'
自动刷新物化视图
本文旨在介绍一种可以在非工作时间稍微锁定一下表格的环境中使用的方法。如果您没有这样的条件,您可能希望并行创建新表格,然后删除原始表格并将副本重命名以尽量减少阻塞。
我会为我所有 mv 规则中的对象保留一个单独的模式 maint
。
下面是我的刷新所有物化视图的函数:
CREATE OR REPLACE FUNCTION maint.f_mv_update()
RETURNS void AS
$func$
DECLARE
_r record;
BEGIN
SET LOCAL work_mem='256MB';
SET LOCAL client_min_messages=warning;
FOR _r IN
SELECT (mv_schema || '.' || mv_tab)::regclass AS tbl
,drop_index
,mv_query
,create_index
FROM maint.mv
WHERE active
ORDER BY mv_id
LOOP
IF _r.drop_index IS NOT NULL THEN
EXECUTE _r.drop_index;
END IF;
EXECUTE 'TRUNCATE TABLE ' || _r.tbl;
EXECUTE 'INSERT INTO ' || _r.tbl || ' ' || _r.mv_query;
IF _r.create_index IS NOT NULL THEN
EXECUTE _r.create_index;
END IF;
EXECUTE 'ANALYZE ' || _r.tbl;
END LOOP;
RESET client_min_messages;
UPDATE maint.mv
SET last_up = localtimestamp(0) WHERE active;
END
$func$ LANGUAGE plpgsql VOLATILE SET search_path=maint,pg_temp;
REVOKE ALL ON FUNCTION maint.f_mv_update() FROM public;
COMMENT ON FUNCTION maint.f_mv_update() IS 'Update materialized Views.
Uses table maint.mv';
与该表相结合,注册所有希望属于该方案的物化视图。
CREATE TABLE maint.mv
(
mv_id integer PRIMARY KEY,
active boolean NOT NULL DEFAULT true,
last_up timestamp(0) NOT NULL DEFAULT '2000-1-1 0:0'::timestamp,
log_up timestamp(0) NOT NULL DEFAULT now()::timestamp(0),
mv_schema text NOT NULL,
mv_tab text NOT NULL,
mv_query text NOT NULL,
drop_index text,
create_index text,
note text
);
REVOKE ALL ON TABLE maint.mv FROM public;
示例行:
INSERT INTO maint.mv
(mv_id, mv_schema, mv_tab, mv_query, drop_index, create_index)
VALUES ( 17, 'mv', 'mytbl'
,'SELECT mytbl_id, count(*) FROM mytbl GROUP BY 1;'
,'DROP INDEX IF EXISTS mv.mytbl_mytbl_id_idx;'
,'CREATE INDEX mytbl_mytbl_id_idx ON mv.mytbl (my_tbl_id);');
呼叫:
SELECT maint.f_mv_update();