CQL(Cassandra Query Language)物化视图

时间:2021-11-17 04:46:44

物化视图名称由以下语法定义:

view_name ::=  re('[a-zA-Z_0-9]+')

创建视图

您可以使用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个主要部分:

  • 限制视图中包含的数据的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 VIEW view_name WITH table_options

可以更新的选项与创建时相同,因此与表相同。

删除物化视图

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

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

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