PostgreSQL 9.3开始支持物化视图,9.4又增加了非阻塞的CONCURRENTLY选项,但REFRESH时却不支持类似START WITH ... NEXT ...的定时刷新选项。
如何实现定时刷新物化视图?主要是以下几种:
借助操作系统,如Linux/Unix的crontab或Windows的定时任务;
借助插件pgAgent;
使用触发器,一般为语句级(... FOR EACH STATEMENT ...)。
近日接触到\watch命令,发现了一种新的刷新物化视图的方法。 \watch 10 --没隔10s执行一次前面的命令,但需要psql开着
应用场景和优劣势:
可以将复杂的SQL写成视图来调用,并可增大数据的安全性
另外物化视图与普通视图比因为直接扫描数据,通常扫描的数据更少,在有索引的支持下,效率更高,网络消耗也更少,特别是跨DB,跨服务器的查询
与普通视图相比的劣势是数据需要不定时地刷新才能获取到最实时的数据
刷新参数with data是全量更新(replace)物化视图内容,且是默认参数;with no data会清除物化视图内容,释放物化视图所占的空间,并使物化视图不可用
异地物化视图(基于外部表)案例:
首先在192.168.100.200上创建extension
postgres=# create extension postgres_fdw;
CREATE EXTENSION
在200上创建server
postgres=# create server pg