这是我参与8月更文挑战的第18天,活动详情查看:8月更文挑战
物化视图名称定义方式
view_name::= re('[a-zA-Z_0-9]+')
创建物化视图
create_materialized_view_statement::= CREATE MATERIALIZED VIEW [ IF NOT EXISTS ] view_name
AS select_statement
PRIMARY KEY '(' primary_key')'
WITH table_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 个主要部分:
除非使用该IF NOT EXISTS选项,否则尝试创建已存在的物化视图将返回错误。如果使用它,如果物化视图已经存在,则该语句将是空操作。
物化视图SELECT
创建物化视图的 select 语句定义了视图中包含哪些基表。该声明在许多方面受到限制:
-
的选择被限制为那些仅选择基本表中的列。换句话说,您不能使用任何函数(聚合与否)、强制转换、术语等。也不支持别名。但是,您可以使用 * 作为选择所有列的快捷方式。此外,静态列不能包含在物化视图中。因此,
SELECT *如果基表具有静态列,则不允许使用命令。该WHERE条款有以下限制:- 不能包括任何
bind_marker - 不能有不属于的部分的列基表不是由一个限制主键
IS NOT NULL限制 - 不允许有其他限制
- 不能让属于视图主键的
IS NOT NULL列为空,它们必须始终至少受到限制(或任何其他限制,但它们必须有一个限制)。
- 不能包括任何
-
不能有排序子句 limit 或ALLOW FILTERING
物化视图 primary key
视图必须具有主键,并且该主键必须符合以下限制:
- 它必须包含基表的所有主键列。这确保视图的每一行都对应于基表的一行。
- 它只能包含一个不是基表中主键列的列。
例如,给出以下基表定义:
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);
物化视图options
物化视图由表在内部实现,因此,创建 MV 允许same options than creating a table <create-table-options>.
改变物化视图
创建后,您可以使用以下ALTER MATERIALIZED VIEW语句更改物化视图的选项:
alter_materialized_view_statement::= ALTER MATERIALIZED VIEW view_name WITH table_options
可以更新的选项与创建时相同,因此same than for tables <create-table-options>.
删除物化视图
使用以下DROP MATERIALIZED VIEW 语句删除物化视图:
drop_materialized_view_statement::= DROP MATERIALIZED VIEW [ IF EXISTS ] view_name;
如果物化视图不存在,该语句将返回错误,除非IF EXISTS在这种情况下使用该操作是无操作