實體化檢視
實體化檢視名稱由下列定義:
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 個主要部分
-
限制檢視中所包含資料的 select 陳述式。
-
檢視的 主鍵 定義。
-
檢視的 選項。
嘗試建立已存在的實體化檢視會傳回錯誤,除非使用 IF NOT EXISTS
選項。如果使用,如果實體化檢視已存在,陳述式將不執行任何操作。
預設情況下,實體化檢視會在單一執行緒中建立。可以透過增加 |
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);
變更資料化檢視
建立後,你可以使用 變更資料化檢視
陳述句變更資料化檢視的選項
alter_materialized_view_statement::= ALTER MATERIALIZED VIEW [ IF EXISTS ] view_name WITH table_options
可以更新的選項與建立時相同,因此與表格相同 <create-table-options>
。如果檢視不存在,陳述句會傳回錯誤,除非使用 IF EXISTS
,這種情況下操作不會執行。