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.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);

MVオプション

マテリアライズドビューは内部的にテーブルによって実装されているため、MVを作成すると、テーブルの作成と同じオプション <create-table-options>が許可されます。

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を使用しない限り、ステートメントはエラーを返します。その場合、操作はノーオペレーションになります。

DROP MATERIALIZED VIEW

DROP MATERIALIZED VIEWステートメントを使用して、マテリアライズドビューを削除します。

drop_materialized_view_statement::= DROP MATERIALIZED VIEW [ IF EXISTS ] view_name;

マテリアライズドビューが存在しない場合、IF EXISTSを使用しない限り、ステートメントはエラーを返します。その場合、操作はノーオペレーションになります。

MVの制限

マテリアライズドビューで選択されていない列の削除(`UPDATE base SET unselected_column = null`または`DELETE unselected_column FROM base`を使用)は、ヒントや修復によって受信された他の列への更新を見逃す可能性があります。このため、CASSANDRA-13826で修正されるまで、ビューで選択されていない基本列の削除は行わないことをお勧めします。