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) ] ] ;
構文規則 | 説明 |
---|---|
大文字 | リテラル・キーワード。 |
小文字 | リテラル以外。 |
イタリック体 |
変数値。ユーザー定義値と置き換えます。 |
[] |
任意。角かっこ( [] )で任意指定のコマンド引数を囲みます。角かっこは入力しないでください。 |
( ) |
グループ。丸かっこ(( ) )は、選択肢を含むグループを示します。丸かっこは入力しないでください。 |
| |
または。縦棒( | )で代替要素を区切ります。要素のいずれかを入力してください。縦棒は入力しないでください。 |
... |
繰り返し可能。省略記号(... )は、構文要素を必要な回数だけ繰り返すことができることを示します。 |
'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以外で、country
がAustralia
に等しい行だけがマテリアライズド・ビューに追加されます。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以外で、age
が19
に等しい行だけがマテリアライズド・ビューに追加されます。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)