视图是表示基础表的数据的虚拟表。简单的视图也可以是可更新的。PostgreSQL 将视图概念扩展到更高级,允许视图物理地存储数据,
这种视图称为物化视图(materialized views)。物化视图将开销非常大的复杂的查询结果进行缓存,然后允许您定期刷新此结果。
一、创建物化视图
create materialized view view_name as query_sql with [no] data;
with data: 创建物化视图后,视图不可查询(因为无数据)
with no data: 创建物化视图后,视图可查询数据
二、刷新物化视图的数据
(1)、即将数据加载到物化视图中。
refresh materialized view view_name;
(2)、刷新物化视图的数据时,或锁定整张表(在大数据量的情况下比较久,会导致其它查询语句无法执行)。为了避免此种情况,可使用concurrently选项。
refresh materialized view concurrently view_name;
注:使用 concurrently 选项,PostgreSQL将创建物化视图的临时更新版本,比较更新版本和原视图两个版本,并仅对差异部分
执行 insert 和 update。
这样就可以在更新时对物化视图进行查询。使用 concurrently 选项的一个要求是:物化视图必须具有 unique 索引。注意
CONCURRENTLY 选项只能在 PostgreSQL 9.4 及以上版本中使用。
create unique index index_name on view_name (列名1,列名2...);
三、删除物化视图
drop materialized view [if exists] view_name;
四、修改物化视图
ALTER MATERIALIZED VIEW [ IF EXISTS ] name action [, ... ]
ALTER MATERIALIZED VIEW [ IF EXISTS ] name
RENAME [ COLUMN ] column_name TO new_column_name
ALTER MATERIALIZED VIEW [ IF EXISTS ] name
RENAME TO new_name
ALTER MATERIALIZED VIEW [ IF EXISTS ] name
SET SCHEMA new_schema
where action is one of:
ALTER [ COLUMN ] column_name SET STATISTICS integer
ALTER [ COLUMN ] column_name SET ( attribute_option = value [, ... ] )
ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] )
ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }
CLUSTER ON index_name
SET WITHOUT CLUSTER
SET ( storage_parameter = value [, ... ] )
RESET ( storage_parameter [, ... ] )
OWNER TO new_owner
SET TABLESPACE new_tablespace