Cassandra物化视图

950 阅读3分钟

这是我参与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在这种情况下使用该操作是无操作