物化视图名称由以下语法定义:
view_name ::= re('[a-zA-Z_0-9]+')
创建视图
您可以使用CREATE MATERIALIZED VIEW语句在表上创建物化视图:
create_materialized_view_statement ::= CREATE MATERIALIZED VIEW [ IF NOT EXISTS ]view_name
ASselect_statement
PRIMARY KEY '('primary_key
')' WITHtable_options
例如:
CREATE MATERIALIZED VIEW monkeySpecies_by_population AS
SELECT * FROM monkeySpecies
WHERE population IS NOT NULL AND species IS NOT NULL
PRIMARY KEY (population, species)
WITH comment='Allow query by population instead of species';
CREATE MATERIALIZED VIEW语句创建一个新的物化视图。每个这样的视图是一组行,这些行对应于在SELECT语句中指定的基础表或基表中存在的行。 物化视图不能直接更新,但对基表的更新将导致视图中的相应更新。
创建物化视图有3个主要部分:
- 限制视图中包含的数据的select语句。
- 视图的主键定义。
- 视图的选项。
尝试创建已存在的实例化视图将返回错误,除非使用IF NOT EXISTS选项。如果使用它,如果物化视图已经存在,语句将是无操作。
物化视图选择语句
物化视图创建的select语句定义了视图中基表被包括的部分。该声明在许多方面有限制:
- 该选择仅限于选择基表的列。换句话说,你不能使用任何函数(聚合或不聚合),转换,term等,也不支持别名。 你可以使用*作为选择所有列的快捷方式。此外,静态列不能包含在物化视图中(这意味着如果基表具有静态列,则不允许使用SELECT *)。
-
WHERE子句有以下限制:
- 它不能包括任何bind_marker。
- 不是基表主键的一部分的列只能受IS NOT NULL限制。不允许其他限制。
- 因为作为视图主键的一部分的列不能为空,所以它们必须始终至少受IS NOT NULL限制(或任何其他限制,但它们必须有一个限制)。
- 它不能既不具有排序子句,也不具有限制,也不具有过滤。
物化视图主键
视图必须具有主键,并且主键必须符合以下限制:
- 它必须包含基表的所有主键列。 这确保视图的每一行对应于基表的一行。
- 它只能包含基表中不是主键列的单个列。
例如,给出以下基表定义:
CREATE TABLE t (
k int,
c1 int,
c2 int,
v1 int,
v2 int,
PRIMARY KEY (k, c1, c2)
)
那么允许以下视图定义:
CREATE MATERIALIZED VIEW mv1 AS
SELECT * FROM t WHERE k IS NOT NULL AND c1 IS NOT NULL AND c2 IS NOT NULL
PRIMARY KEY (c1, k, c2)
CREATE MATERIALIZED VIEW mv1 AS
SELECT * FROM t WHERE k IS NOT NULL AND c1 IS NOT NULL AND c2 IS NOT NULL
PRIMARY KEY (v1, k, c1, c2)
但不允许以下几种:
// Error: cannot include both v1 and v2 in the primary key as both are not in the base table primary key
CREATE MATERIALIZED VIEW mv1 AS
SELECT * FROM t WHERE k IS NOT NULL AND c1 IS NOT NULL AND c2 IS NOT NULL AND v1 IS NOT NULL
PRIMARY KEY (v1, v2, k, c1, c2)
// Error: must include k in the primary as it's a base table primary key column
CREATE MATERIALIZED VIEW mv1 AS
SELECT * FROM t WHERE c1 IS NOT NULL AND c2 IS NOT NULL
PRIMARY KEY (c1, c2)
物化视图选项
物化视图在内部由表实现,因此,创建物化视图允许与创建表相同的选项。更改物化视图
创建后,您可以使用ALTER MATERIALIZED VIEW语句更改物化视图的选项:
alter_materialized_view_statement ::= ALTER MATERIALIZED VIEWview_name
WITHtable_options
可以更新的选项与创建时相同,因此与表相同。
删除物化视图
删除物化视图用户使用DROP MATERIALIZED VIEW语句:drop_materialized_view_statement ::= DROP MATERIALIZED VIEW [ IF EXISTS ] view_name
;
如果物化视图不存在,则语句将返回错误,除非使用IF EXISTS,在这种情况下操作是无操作。