CREATE MATERIALIZED VIEW

読み取り要求を最適化し、ベース・テーブルのデータを複製することで書き込み要求を何度も行う必要をなくします。

ベース・テーブルと異なるパーティション分割カラムとクラスター化カラムを許可して読み取り要求を最適化し、テーブルごとにそれぞれ書き込み要求を行う必要をなくします。データがベース・テーブルに書き込まれると、関連付けられたすべてのマテリアライズド・ビューにも自動的に書き込まれます。
制約事項:
  • ベース・テーブルのすべてのプライマリ・キーをマテリアライズド・ビューで使用します。
  • パーティション・キーがベース・テーブルと同じ場合ベース・テーブルの複数の非プライマリ・キー・カラムがサポートされていますが、マテリアライズド・ビューのPRIMARY KEYではベース・テーブルの単一の非プライマリ・キーしか許可されていません。
  • 静的カラムはサポートされていません。

構文

CREATE MATERIALIZED VIEW [ IF NOT EXISTS ] [keyspace_name.]view_name
  AS SELECT [ (column_list) ]
  FROM [keyspace_name.]table_name
  [ WHERE column_name IS NOT NULL
  [ AND column_name IS NOT NULL ... ] ]
  [ AND relation [ AND ... ] ] 
  PRIMARY KEY ( column_list )
  [ WITH [ table_properties ]
  [ [ AND ] CLUSTERING ORDER BY (cluster_column_name order_option) ] ] ;
1. 凡例
構文規則 説明
大文字 リテラル・キーワード。
小文字 リテラル以外。
イタリック体 変数値。ユーザー定義値と置き換えます。
[] 任意。角かっこ( [] )で任意指定のコマンド引数を囲みます。角かっこは入力しないでください。
( ) グループ。丸かっこ(( ))は、選択肢を含むグループを示します。丸かっこは入力しないでください。
| または。縦棒( | )で代替要素を区切ります。要素のいずれかを入力してください。縦棒は入力しないでください。
... 繰り返し可能。省略記号(...)は、構文要素を必要な回数だけ繰り返すことができることを示します。
'Literal string' 単一引用符( ' )でCQL文内のリテラル文字を囲みます。大文字を維持するには、単一引用符を使用します。
{ key : value } マップ・コレクション。中かっこ( { } )でマップ・コレクションまたはキーと値のペアを囲みます。コロンでキーと値を区切ります。
<datatype1,datatype2> セット、リスト、マップ、またはタプル。山かっこ(< >)で、セット、リスト、マップまたはタプル内のデータ型を囲みます。データ型はコンマで区切ります。
cql_statement; CQL文の終了。セミコロン( ; )ですべてのCQL文を終了します。
[--] コマンドライン・オプションとコマンド引数は、2つのハイフン(--)。この構文は、引数がコマンドライン・オプションと間違われる可能性がある場合に役立ちます。
' <schema> ... </schema> ' 検索CQLのみ:単一引用符( ' )でXMLスキーマ宣言全体を囲みます。
@xml_entity='xml_entity_type' 検索CQLのみ:スキーマ・ファイルおよびsolrConfigファイル内のXML要素を上書きするための実体とリテラル値を示します。
IF NOT EXISTS
任意。既に存在するマテリアライズド・ビューを作成しようとすると表示されるエラー・メッセージを抑制します。SOURCEコマンドなど、コマンドの実行を継続する目的で使用します。このオプションは、同じ名前のマテリアライズド・ビューが存在することのみを示します。カラム、プライマリ・キー、プロパティ、その他の設定は異なる可能性があります。
keyspace_name
任意。キースペースが選択されていない場合、または別のキースペースでビューを作成する場合は、キースペース名をマテリアライズド・ビュー名の前に設定します。
注: ベース・テーブルとマテリアライズド・ビューは常に同じキースペース内にあります。
view_name
マテリアライズド・ビュー名に含めることができるのは、英数字とアンダースコアだけです。ビュー名は英数字で始まり、文字数が49文字以下でなければなりません。
column_list

マテリアライズド・ビューに含めるベース・テーブルのカラムのコンマ区切りリスト。

静的カラムは指定されている場合でも、マテリアライズド・ビューではサポートされず、これに含まれません。

column_name IS NOT NULL

すべてのカラムについてWHERE 句にNull値が含まれているかどうかをテストします。各条件はANDで区切ります。カラムにNull値が含まれている行は、マテリアライズド・ビュー・テーブルに挿入されません。

AND relation

必要な特定のデータを対象とするその他の関係。

PRIMARY KEY ( column_list )

データのパーティション分割とクラスター化に使用されるカラムのコンマ区切りリスト。ベース・テーブルの非プライマリ・キー・カラムを追加できます。テーブルのクエリー効率を高めるには、パーティション分割キーとクラスター化キーを変更するなど、プライマリ・キーの順序を必要に応じて変更してください。

パーティション・キー、クラスター化キーの順にリストします。複合パーティション・キーを作成するには、次のようにカラム名を丸かっこで囲みます。
PRIMARY KEY (
  ( PK_column1 [, PK_column2... ] ),
  clustering_column1 [, clustering_column2 ... ] )
table_properties
任意。デフォルトとは異なる場合にテーブル・プロパティを指定します。テーブル・プロパティ定義はANDで区切ります。
注: ベース・テーブル・プロパティはコピーされません。
制約事項: マテリアライズド・ビューでは、変更ログ(CDC)は使用できません。

このセクションでは、マテリアライズド・ビューの使用を説明するシナリオの例を示します。

マテリアライズド・ビューの基本的な例

これらのテーブルは、最初のシナリオの例で使用されます。
CREATE TABLE IF NOT EXISTS cycling.cyclist_base (
  cid UUID PRIMARY KEY,
  name text,
  age int,
  birthday date,
  country text
);
CREATE TABLE IF NOT EXISTS cycling.cyclist_base_ext (
  cid UUID, 
  name text, 
  age int, 
  birthday date, 
  country text,
  PRIMARY KEY (cid, age, birthday)
);
以下のマテリアライズド・ビュー、cyclist_by_ageでは、ベース・テーブル、cyclist_baseを使用します。WHERE句により、ageカラムとcidカラムがNULL以外の行だけがマテリアライズド・ビューに追加されます。マテリアライズド・ビューでは、ageがパーティション・キーで、cidはクラスター化カラムです。ベース・テーブルで、cidはパーティション・キーです。
CREATE MATERIALIZED VIEW cycling.cyclist_by_age AS
  SELECT age, cid, birthday, country, name
  FROM cycling.cyclist_base 
  WHERE age IS NOT NULL
    AND cid IS NOT NULL
  PRIMARY KEY (age, cid)
  WITH CLUSTERING ORDER BY (cid ASC)
  AND caching = { 'keys' : 'ALL', 'rows_per_partition' : '100' }
  AND comment = 'Based on table cyclist';
クエリー:
SELECT *
FROM cycling.cyclist_by_age;
の結果は以下のとおりです。
 age | cid                                  | birthday   | country       | name
-----+--------------------------------------+------------+---------------+---------------------
  28 | 6ab09bec-e68e-48d9-a5f8-97e6fb4c9b47 | 1987-06-07 |   Netherlands |   Steven KRUIKSWIJK
  19 | 1c526849-d3a2-42a3-bcf9-7903c80b3d16 | 1998-12-23 |     Australia |       Kanden GROVES
  19 | 410919ef-bd1b-4efa-8256-b0fd8ab67029 | 1999-01-04 |    Uzbekistan | Iskandarbek SHODIEV
  18 | 15a116fc-b833-4da6-ab9a-4a7775752836 | 1997-08-19 | United States |        Adrien COSTA
  18 | 18f471bf-f631-4bc4-a9a2-d6f6cf5ea503 | 1997-03-29 |   Netherlands |         Bram WELTEN
  18 | ffdfa2a7-5fc6-49a7-bfdc-3fcdcfdd7156 | 1997-02-08 |   Netherlands |    Pascal EENKHOORN
  22 | e7ae5cf3-d358-4d99-b900-85902fda9bb0 | 1993-06-18 |   New Zealand |          Alex FRAME
  27 | c9c9c484-5e4a-4542-8203-8d047a01b8a8 | 1987-09-04 |        Brazil |     Cristian EGIDIO
  27 | d1aad83b-be60-47a4-bd6e-069b8da0d97b | 1987-09-04 |       Germany |     Johannes HEIDER
  20 | 862cc51f-00a1-4d5a-976b-a359cab7300e | 1994-09-04 |       Denmark |       Joakim BUKDAL
  38 | 220844bf-4860-49d6-9a4b-6b5d3a79cbfb | 1977-07-08 |         Italy |     Paolo TIRALONGO
  29 | 96c4c40d-58c8-4710-b73f-681e9b1f70ae | 1989-04-20 |     Australia |     Benjamin DYBALL

(12 rows)
以下のマテリアライズド・ビュー、cyclist_by_birthday_and_ageでは、ベース・テーブル、cyclist_baseを使用します。WHERE句により、ageカラム、birthdayカラム、およびcidカラムがNULL以外の行だけがマテリアライズド・ビューに追加されます。マテリアライズド・ビューでは、cidがパーティション・キーで、birthdayは最初のクラスター化カラムで、ageが2番目のクラスター化カラムです。ベース・テーブルで、cidはパーティション・キーです。
CREATE MATERIALIZED VIEW cycling.cyclist_by_birthday_and_age AS
  SELECT age, cid, birthday, country, name
  FROM cycling.cyclist_base
  WHERE age IS NOT NULL
    AND birthday IS NOT NULL
    AND cid IS NOT NULL
  PRIMARY KEY (cid, birthday, age);
クエリー:
SELECT *
FROM cycling.cyclist_by_birthday_and_age;
の結果は以下のとおりです。
 cid                                  | birthday   | age | country       | name
--------------------------------------+------------+-----+---------------+---------------------
 ffdfa2a7-5fc6-49a7-bfdc-3fcdcfdd7156 | 1997-02-08 |  18 |   Netherlands |    Pascal EENKHOORN
 15a116fc-b833-4da6-ab9a-4a7775752836 | 1997-08-19 |  18 | United States |        Adrien COSTA
 e7ae5cf3-d358-4d99-b900-85902fda9bb0 | 1993-06-18 |  22 |   New Zealand |          Alex FRAME
 c9c9c484-5e4a-4542-8203-8d047a01b8a8 | 1987-09-04 |  27 |        Brazil |     Cristian EGIDIO
 410919ef-bd1b-4efa-8256-b0fd8ab67029 | 1999-01-04 |  19 |    Uzbekistan | Iskandarbek SHODIEV
 d1aad83b-be60-47a4-bd6e-069b8da0d97b | 1987-09-04 |  27 |       Germany |     Johannes HEIDER
 862cc51f-00a1-4d5a-976b-a359cab7300e | 1994-09-04 |  20 |       Denmark |       Joakim BUKDAL
 1c526849-d3a2-42a3-bcf9-7903c80b3d16 | 1998-12-23 |  19 |     Australia |       Kanden GROVES
 18f471bf-f631-4bc4-a9a2-d6f6cf5ea503 | 1997-03-29 |  18 |   Netherlands |         Bram WELTEN
 220844bf-4860-49d6-9a4b-6b5d3a79cbfb | 1977-07-08 |  38 |         Italy |     Paolo TIRALONGO
 6ab09bec-e68e-48d9-a5f8-97e6fb4c9b47 | 1987-06-07 |  28 |   Netherlands |   Steven KRUIKSWIJK
 96c4c40d-58c8-4710-b73f-681e9b1f70ae | 1989-04-20 |  29 |     Australia |     Benjamin DYBALL

(12 rows)
以下のマテリアライズド・ビュー、cyclist_by_country_and_birthdayでは、ベース・テーブル、cyclist_baseを使用します。WHERE句により、birthdayカラムとcidカラムがNULL以外で、countryAustraliaに等しい行だけがマテリアライズド・ビューに追加されます。
CREATE MATERIALIZED VIEW cycling.cyclist_by_country_and_birthday AS
  SELECT age, cid, birthday, country, name
  FROM cycling.cyclist_base
  WHERE birthday IS NOT NULL
    AND cid IS NOT NULL
    AND country = 'Australia'
  PRIMARY KEY (cid, country, birthday);
クエリー:
SELECT *
FROM cycling.cyclist_by_country_and_birthday;
の結果は以下のとおりです。
 cid                                  | country   | birthday   | age | name
--------------------------------------+-----------+------------+-----+-----------------
 1c526849-d3a2-42a3-bcf9-7903c80b3d16 | Australia | 1998-12-23 |  19 |   Kanden GROVES
 96c4c40d-58c8-4710-b73f-681e9b1f70ae | Australia | 1989-04-20 |  29 | Benjamin DYBALL

(2 rows)
以下のマテリアライズド・ビュー、cyclist_by_birthday_and_age19では、ベース・テーブル、cyclist_baseを使用します。WHERE句により、birthdayカラムとcidカラムがNULL以外で、age19に等しい行だけがマテリアライズド・ビューに追加されます。
CREATE MATERIALIZED VIEW cycling.cyclist_by_birthday_and_age19 AS
  SELECT age, cid, birthday, country, name
  FROM cycling.cyclist_base
  WHERE birthday IS NOT NULL
    AND cid IS NOT NULL
    AND age = 19
  PRIMARY KEY (cid, birthday, age);
クエリー:
SELECT *
FROM cycling.cyclist_by_birthday_and_age19;
の結果は以下のとおりです。
 cid                                  | birthday   | age | country    | name
--------------------------------------+------------+-----+------------+---------------------
 410919ef-bd1b-4efa-8256-b0fd8ab67029 | 1999-01-04 |  19 | Uzbekistan | Iskandarbek SHODIEV
 1c526849-d3a2-42a3-bcf9-7903c80b3d16 | 1998-12-23 |  19 |  Australia |       Kanden GROVE

(2 rows)
以下のマテリアライズド・ビュー、cyclist_by_age_birthday_cidでは、ベース・テーブル、cyclist_base_extを使用します。WHERE句により、ageカラム、birthdayカラム、およびcidカラムがNULL以外の行だけがマテリアライズド・ビューに追加されます。
CREATE MATERIALIZED VIEW cycling.cyclist_by_age_birthday_cid AS
  SELECT age, cid, birthday, country, name
  FROM cycling.cyclist_base_ext
  WHERE age IS NOT NULL
    AND birthday IS NOT NULL
    AND cid IS NOT NULL
  PRIMARY KEY (age, birthday, cid);
クエリー:
SELECT *
FROM cycling.cyclist_by_age_birthday_cid
WHERE age = 19;
の結果は以下のとおりです。
 cid                                  | birthday   | age | country    | name
--------------------------------------+------------+-----+------------+---------------------
 410919ef-bd1b-4efa-8256-b0fd8ab67029 | 1999-01-04 |  19 | Uzbekistan | Iskandarbek SHODIEV
 1c526849-d3a2-42a3-bcf9-7903c80b3d16 | 1998-12-23 |  19 |  Australia |       Kanden GROVE

(2 rows)
2つの値にWHERE句を使用するクエリー:
SELECT *
FROM cycling.cyclist_by_age_birthday_cid
WHERE age = 19
  AND birthday = '1998-12-23';
の結果は以下のとおりです。
 age | birthday   | cid                                  | country   | name
-----+------------+--------------------------------------+-----------+---------------
  19 | 1998-12-23 | 1c526849-d3a2-42a3-bcf9-7903c80b3d16 | Australia | Kanden GROVES

(1 rows)
クラスター化カラムは順に含める必要があります。このクエリーは以下のルールに違反しています。
SELECT *
FROM cycling.cyclist_by_age_birthday_cid
WHERE birthday = '1998-12-23';
結果:
cyclist_by_age-mv.cql:195:InvalidRequest: Error from server: code=2200 [Invalid query] message="Cannot 
execute this query as it might involve data filtering and thus may have unpredictable performance. If you 
want to execute this query despite the performance unpredictability, use ALLOW FILTERING.

マテリアライズド・ビューを使用して、ベース・テーブルで実行できないクエリを実行する

以下のシナリオでは、ALLOW FILTERINGが使用されない限り、ベース・テーブルでは実行できないクエリーをマテリアライズド・ビューを使用して実行する方法を示します。パフォーマンスが低下するため、ALLOW FILTERINGを使用することは推奨されません。このテーブルには、以下のサイクリング・チームのメカニック情報が格納されます。
CREATE TABLE IF NOT EXISTS cycling.mechanic (
  emp_id int,
  dept_id int,
  name text,
  age int,
  birthdate date,
  PRIMARY KEY (emp_id, dept_id)
);
このテーブルには次の行が含まれます。
 emp_id | dept_id | age | birthdate  | name
--------+---------+-----+------------+------------
      5 |       3 |  25 | 1996-10-04 | Lisa SMITH
      1 |       1 |  21 | 1992-06-18 | Fred GREEN
      2 |       1 |  22 | 1993-01-15 | John SMITH
      4 |       2 |  24 | 1995-08-19 | Jack JONES
      3 |       2 |  23 | 1994-02-07 |   Jane DOE

(5 rows)
このマテリアライズド・ビューでは前のテーブルのカラムが選択され、このテーブルとは異なるプライマリ・キーが含まれています。
CREATE MATERIALIZED VIEW cycling.mechanic_view AS
  SELECT emp_id, dept_id, name, age, birthdate
  FROM cycling.mechanic
  WHERE emp_id IS NOT NULL
    AND dept_id IS NOT NULL
    AND name IS NOT NULL
    AND age IS NOT NULL
    AND birthdate IS NOT NULL
  PRIMARY KEY (age, emp_id, dept_id);
このクエリーではageが21の行を取得します。
SELECT *
FROM cycling.mechanic_view
WHERE age = 21;
前のクエリーは、ALLOW FILTERINGを使用しないと、ベース・テーブル上で実行できません。前のクエリーからの出力は以下のとおりです。
 age | emp_id | dept_id | birthdate  | name
-----+--------+---------+------------+------------
  21 |      1 |       1 | 1992-06-18 | Fred GREEN

(1 rows)