Cassandra 文档

版本

您正在查看预发布版本的文档。

物化视图

物化视图名称由以下定义

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 选项。如果使用此选项,如果物化视图已存在,则该语句将是无操作的。

默认情况下,物化视图是在单个线程中构建的。可以通过增加 cassandra.yaml 中属性 concurrent_materialized_view_builders 指定的线程数来并行化初始构建。此属性也可以通过 JMX 和 setconcurrentviewbuildersgetconcurrentviewbuilders nodetool 命令在运行时进行操作。

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);

MV 选项

物化视图在内部由表实现,因此,创建 MV 允许使用与创建表相同的选项 <create-table-options>。

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,在这种情况下,操作将是无操作的。

DROP MATERIALIZED VIEW

使用 DROP MATERIALIZED VIEW 语句删除物化视图

drop_materialized_view_statement::= DROP MATERIALIZED VIEW [ IF EXISTS ] view_name;

如果物化视图不存在,该语句将返回错误,除非使用 IF EXISTS,在这种情况下,操作将是无操作的。

MV 限制

删除物化视图中未选择的列(通过 UPDATE base SET unselected_column = nullDELETE unselected_column FROM base)可能会隐藏通过提示或修复接收到的其他列的未处理更新。因此,我们建议不要在基本列上执行删除操作,直到 CASSANDRA-13826 修复为止。