マテリアライズドビュー
マテリアライズドビューの名前は、
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
オプションを使用しない限り、エラーが返されます。このオプションを使用した場合、マテリアライズドビューが既に存在する場合は、ステートメントはノーオペレーションになります。
デフォルトでは、マテリアライズドビューは単一のスレッドで構築されます。`cassandra.yaml`の`concurrent_materialized_view_builders`プロパティで指定されたスレッド数を増やすことで、初期構築を並列化できます。このプロパティは、JMXと`setconcurrentviewbuilders`および`getconcurrentviewbuilders` nodetoolコマンドの両方を通じて、実行時に操作することもできます。 |
MV SELECTステートメント
マテリアライズドビュー作成のSELECTステートメントは、ビューに基本テーブルのどのデータが含まれるかを定義します。そのステートメントにはいくつかの制限があります。
-
選択は、基本テーブルの列のみを選択する選択に限定されます。つまり、関数(集約関数を含む)、キャスト、項などは使用できません。エイリアスもサポートされていません。ただし、すべての列を選択するショートカットとして*を使用できます。さらに、静的列をマテリアライズドビューに含めることはできません。したがって、基本テーブルに静的列がある場合、`SELECT *`コマンドは許可されません。`WHERE`句には次の制限があります。
-
`bind_marker`を含めることはできません。
-
`IS NOT NULL`制限によって制限されていない、基本テーブルの主キーの一部ではない列を含めることはできません。
-
その他の制限は許可されません。
-
ビューの主キーの一部である列がNULLになることはできません。常に少なくとも`IS NOT NULL`制限(またはその他の制限)によって制限されている必要があります。
-
-
順序句、LIMIT、またはxref:cassandra:developing/cql/dml.adoc#allow-filtering[ALLOW FILTERING]を含めることはできません。
MV主キー
ビューには主キーが必要です。その主キーは次の制限に従う必要があります。
-
基本テーブルのすべての主キー列を含める必要があります。これにより、ビューのすべての行が基本テーブルの正確に1つの行に対応することが保証されます。
-
基本テーブルで主キー列ではない列を1つだけ含めることができます。
たとえば、次の基本テーブル定義があるとします。
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
作成後、ALTER MATERIALIZED VIEW
ステートメントを使用して、マテリアライズドビューのオプションを変更できます。
alter_materialized_view_statement::= ALTER MATERIALIZED VIEW [ IF EXISTS ] view_name WITH table_options
更新できるオプションは、作成時と同じであり、したがってテーブルの場合と同じ <create-table-options>
です。ビューが存在しない場合、IF EXISTS
を使用しない限り、ステートメントはエラーを返します。その場合、操作はノーオペレーションになります。