物化视图
物化视图名称由以下定义
view_name::= re('[a-zA-Z_0-9]+')
CREATE MATERIALIZED VIEW
您可以使用 CREATE MATERIALIZED VIEW
语句在表上创建物化视图
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
选项。如果使用此选项,如果物化视图已存在,则该语句将是无操作的。
默认情况下,物化视图是在单个线程中构建的。可以通过增加 |
MV select 语句
物化视图创建的 select 语句定义了基本表中的哪些内容包含在视图中。该语句在以下方面受到限制
-
选择仅限于仅选择基本表列的选择。换句话说,您不能使用任何函数(聚合或非聚合)、强制转换、术语等。别名也不受支持。但是,您可以使用 * 作为选择所有列的快捷方式。此外,静态列不能包含在物化视图中。因此,如果基本表具有静态列,则不允许使用
SELECT *
命令。WHERE
子句具有以下限制-
不能包含任何
bind_marker
-
不能包含不在基本表主键中且不受
IS NOT NULL
限制的列 -
不允许其他限制
-
不能包含在视图主键中的列为空,它们必须始终至少受
IS NOT NULL
限制(或任何其他限制,但它们必须有一个)。
-
-
不能包含排序子句、限制或 xref:cassandra:developing/cql/dml.adoc#allow-filtering[ALLOW FILTERING
MV 主键
视图必须具有主键,并且该主键必须符合以下限制
-
它必须包含基本表的所有主键列。这确保视图的每一行都对应于基本表的恰好一行。
-
它只能包含一个不是基本表中主键列的列。
例如,给定以下基本表定义
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
语句更改物化视图的选项
alter_materialized_view_statement::= ALTER MATERIALIZED VIEW [ IF EXISTS ] view_name WITH table_options
可以更新的选项与创建时的选项相同,因此与表相同 <create-table-options>。如果视图不存在,该语句将返回错误,除非使用 IF EXISTS
,在这种情况下,操作将是无操作的。