参考文章:Materialized View模式blog.csdn.net

MYSQL物化视图查询 mysql物化视图详解_PostgreSQL

PostgreSQL物化视图(materialized view)过程解析www.jb51.net

还有《PostgreSQL11.2-中文手册》

CREATE MATERIALIZED VIEW mymatview AS SELECT * FROM mytab;

物化视图不能直接被更新,并且用于创建物化视图的查询的存储方式和视图查询的存储方式完全相同,因此要为物化视图生成新鲜的数据:

REFRESH MATERIALIZED VIEW mymatview;

对于解析器,一个物化视图就是一个关系,就像一个表或一个视图。

当一个物化视图被一个查询引用时,数据直接从物化视图中返回,如同表一样;

虽然对物化视图中存储的数据的访问常常要快于直接访问底层表或通过一个视图访问,但是

数据并不总是最新的;但是某些时候并不需要当前数据。

考虑一个记录销售情况的表:

CREATE TABLE invoice (
invoice_no integer PRIMARY KEY,
seller_no integer, -- 销售员的 ID
invoice_date date, -- 销售日期
invoice_amt numeric(13,2) -- 销售量
)

如果人们想快速绘制历史销售数据,他们可能希望汇总,并且他们可能并不关心当前日期的

不完整数据:

PostgreSQL获取当前时间的四种方式:

1.now()

2.current_timestamp

3.current_time

4.current_date

CREATE MATERIALIZED VIEW sales_summary AS
SELECT
seller_no,
invoice_date,
sum(invoice_amt)::numeric(13,2) as sales_amt
FROM invoice
WHERE invoice_date < CURRENT_DATE
GROUP BY seller_no, invoice_date
ORDER BY seller_no, invoice_date;
CREATE UNIQUE INDEX sales_summary_seller
ON sales_summary (seller_no, invoice_date)

这个物化视图可能对在为销售员创建的控制面板上显示一个图表非常有用。可以用一个计划

任务在每晚使用这个 SQL 语句更新该统计信息:

REFRESH MATERIALIZED VIEW sales_summary;
CREATE MATERIALIZED VIEW

定义一个新的物化视图

CREATE MATERIALIZED VIEW [ IF NOT EXISTS ] table_name
[ (column_name [, ...] ) ]
[ WITH ( storage_parameter [= value] [, ... ] ) ]
[ TABLESPACE tablespace_name ]
AS query
[ WITH [ NO ] DATA ]
IF NOT EXISTS

如果已经存在一个同名的物化视图时不要抛出错误。这种情况下会发出一个提示。注意

这不保证现有的物化视图与即将创建的物化视图相似。

table_name

要创建的物化视图的名称(可以被模式限定)。

column_name

新物化视图中的一个列名。如果没有提供列名,会从查询的输出列名来得到。

WITH ( storage_parameter [= value] [, ... ] )

这个子句为新的物化视图指定可选的存储参数,详见 存储参数。所有CREATE TABLE支持

的参数CREATE MATERIALIZED VIEW也支持,不过OIDS除外。 详见CREATE TABLE。

TABLESPACE tablespace_name

tablespace_name是 要把新物化视图创建在其中的表空间的名称。如果没有指定, 将查

阅default_tablespace。

query

一个SELECT、TABLE 或者VALUES命令。这个查询将在一个安全受限的操作中运行。 特别

地,对本身会创建临时表的函数的调用将会失败。

WITH [ NO ] DATA

这个子句指定物化视图是否在创建时被填充。如果不是,该物化视图将被标记为 不可扫

描并且在REFRESH MATERIALIZED VIEW被使用前不能被查询。

在该命令被发出时,查询会被执行并且被用来填充该视图(除非使用了 WITH NO DATA),并且后来可能会用 REFRESHMATERIALIZED VIEW进行刷新。

CREATE MATERIALIZED VIEW类似于 CREATE TABLE AS,不过它还会记住被用来初始化该视图的查询, 这样它可以在后来被命令刷新。

一个物化视图有很多和表相同的属性,但是不支持临时物化视图以及自动生成 OID。

ALTER MATERIALIZED VIEW

更改一个物化视图的定义

ALTER MATERIALIZED VIEW [ IF EXISTS ] name
action [, ... ]
ALTER MATERIALIZED VIEW name
DEPENDS ON EXTENSION extension_name
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
ALTER MATERIALIZED VIEW ALL IN TABLESPACE name [ OWNED BY role_name [, ... ] ]
SET TABLESPACE new_tablespace [ NOWAIT ]

其中 action是下列之一:

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 | CURRENT_USER | SESSION_USER }
name

一个现有物化视图的名称(可以是模式限定的)。

column_name

一个新的或者现有的列的名称。

extension_name

该物化视图所依赖的扩展的名称。

new_column_name

一个现有列的新名称。

new_owner

该物化视图的新拥有者的用户名。

new_name

该物化视图的新名称。

new_schema

该物化视图的新模式

要使用ALTER MATERIALIZED VIEW,你必须拥有该物化视图。要更改一个物化视图的模式,

你还必须拥有新模式上的CREATE特权。要更改拥有者,你还必须是新拥有角色的一个直接

或者间接成员,并且该角色必须拥有该 物化视图所在模式上的CREATE特权(这些限制强制

修改拥有者不 能做一些通过删除和重建该物化视图做不到的事情。不过,一个超级用户怎

么都能更改 任何视图的所有权。

DROP MATERIALIZED VIEW
DROP MATERIALIZED VIEW [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
IF EXISTS

如果该物化视图不存在则不要抛出一个错误,而是发出一个提示。

name

要移除的物化视图的名称(可以是模式限定的)。

CASCADE

自动删除依赖于该物化视图的对象(例如其他物化视图或常规视图),然后删除所有 依

赖于那些对象的对象(见Section 5.13 )。

RESTRICT

如果有任何对象依赖于该物化视图,则拒绝删除它。这是默认值。

REFRESH MATERIALIZED VIEW
REFRESH MATERIALIZED VIEW [ CONCURRENTLY ] name
[ WITH [ NO ] DATA ]
CONCURRENTLY

对物化视图的刷新不阻塞在该物化视图上的并发选择。如果没有这个选项, 一次影响很

多行的刷新将使用更少的资源并且更快结束,但是可能会阻塞 其他尝试从物化视图中读

取的连接。这个选项在只有少量行被影响的情况 下可能会更快。

只有当物化视图上有至少一个UNIQUE索引(只用列名 并且包括所有行)时,才允许这个

选项。也就是说,该索引不能建立在任何 表达式上或者包括WHERE子句。

当物化视图还未被填充时,这个选项不能被使用。

即使带有这个选项,对于任意一个物化视图一次也只能运行一个 REFRESH。

name

要刷新的物化视图的名称(可以被模式限定)

REFRESH MATERIALIZED VIEW完全替换一个 物化视图的内容。你必须是该物化视图的属主才能执行这个命令. 旧的内容会被抛弃。

如果指定了 WITH DATA(或者作为默认值),支持查询将被执行以提供新的数据,并且会让物化视图将处于可扫描的状态。

如果指定了 WITH NO DATA,则不会生成新数据并且会让物化视图 处于一种不可扫描的状态。

CONCURRENTLY和WITH NO DATA 不能被一起指定。