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.yamlconcurrent_materialized_view_builders 屬性指定的執行緒數,將初始建立平行化。此屬性也可以透過 JMX 和 setconcurrentviewbuildersgetconcurrentviewbuilders nodetool 命令在執行階段操作。

MV select 陳述式

實體化檢視建立的 select 陳述式定義哪個基礎表格包含在檢視中。該陳述式受到許多限制

  • 選取僅限於只選取基礎表格的欄位。換句話說,您不能使用任何函數(聚合或非聚合)、強制轉換、術語等。別名也不受支援。但是,您可以使用 * 作為選取所有欄位的捷徑。此外,靜態欄位無法包含在實體化檢視中。因此,如果基礎表格有靜態欄位,則不允許使用 SELECT * 命令。WHERE 子句有下列限制

    • 不能包含任何 bind_marker

    • 不能有欄位不是基礎表格主鍵的一部分,且不受 IS NOT NULL 限制限制

    • 不允許其他限制

    • 不能有欄位是檢視主鍵的一部分為 null,它們必須至少受到 IS NOT NULL 限制(或任何其他限制,但它們必須有一個)。

  • 不能有 排序子句限制 或 xref:cassandra:developing/cql/dml.adoc#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_statement::= ALTER MATERIALIZED VIEW [ IF EXISTS ] view_name WITH table_options

可以更新的選項與建立時相同,因此與表格相同 <create-table-options>。如果檢視不存在,陳述句會傳回錯誤,除非使用 IF EXISTS,這種情況下操作不會執行。

刪除資料化檢視

使用 刪除資料化檢視 陳述句刪除資料化檢視

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 中修正此問題。