マテリアライズド・ビューの作成

CQLマテリアライズド・ビューの作成方法。

Cassandra 3.0以降では、マテリアライズド・ビューは、別のテーブルのデータを使用して、新しいプライマリ・キーを指定して構築したテーブルを指します。Cassandraでは、クエリーはプライマリ・キー定義ごとに最適化され、クエリーごとにテーブルがある場合もあります。新しいクエリーが必要な場合は新しいテーブルが作成されます。以前は、これらの追加のテーブルは、クライアント・アプリケーションで手動で作成および更新されていました。マテリアライズド・ビューでは、元のテーブルの更新および削除に伴って値が更新および削除されます。

セカンダリ・インデックスは低いカーディナリティのデータに適していますが、マテリアライズド・ビューは高いカーディナリティのデータに適しています。高いカーディナリティのデータに対するセカンダリ・インデックスでは、クラスター内のすべてのノードのクエリーが必要なため、読み取りレイテンシーが高くなります。マテリアライズド・ビューでは、データは新しいテーブルの新しいプライマリ・キーに基づいて連続して配置されます。低いカーディナリティのデータを挿入すると、マテリアライズド・ビューではホットスポットが生じます。

マテリアライズド・ビューを作成するには、特定の要件を満たす必要があります。
  • 元のテーブルのプライマリ・キーのカラムは、マテリアライズド・ビューのプライマリ・キーの一部である必要があります。
  • マテリアライズド・ビューのプライマリ・キーには1つのみの新しいカラムを追加できます。
以下のテーブルは、構築するマテリアライズド・ビューの元のテーブルまたはベース・テーブルです。
CREATE TABLE cyclist_mv (cid UUID PRIMARY KEY, name text, age int, birthday date, country text);
このテーブルには、複数のサイクリストの名前、年齢、生年月日、および所属国の値が格納されています。

マテリアライズド・ビューは、ファイルのプライマリ・インデックスとしてageを使用するcyclist_mvから作成できます。
CREATE MATERIALIZED VIEW cyclist_by_age AS SELECT age, birthday, name, country FROM cyclist_mv WHERE age IS NOT NULL AND cid IS NOT NULL PRIMARY KEY (age, cid);
CREATE MATERIALIZED VIEW文には複数の機能があります。AS SELECT句はベース・テーブルからマテリアライズド・ビューにコピーするカラムを指定します。FROM句は、データのコピー元であるベース・テーブルを指定します。WHERE句には、すべてのプライマリ・キーのカラムのデータのある行のみがコピーされるように、IS NOT NULL句のあるすべてのプライマリ・キー・カラムを含める必要があります。最後に、他のテーブルと同様に、マテリアライズド・ビューはプライマリ・キー・カラムを指定します。cyclist_mvではプライマリ・キーとしてcidを使用したため、マテリアライズド・ビューのプライマリ・キーにはcidが存在する必要があります。
新しいマテリアライズド・ビューでは、サイクリストの年齢に基づいてデータを選択できます。データは年齢に基づいてパーティションされているため、簡単にすばやくデータを取得することができます。
SELECT age, name, birthday FROM cyclist_by_age WHERE age = 18;

同様に、サイクリストの生年月日や出身国に情報を合わせたマテリアライズド・ビューを作成できます。
CREATE MATERIALIZED VIEW cyclist_by_country AS SELECT age,birthday, name, country FROM cyclist_mv WHERE country IS NOT NULL AND cid IS NOT NULL PRIMARY KEY (country, cid); CREATE MATERIALIZED VIEW cyclist_by_birthday AS SELECT age, birthday, name, country FROM cyclist_mv WHERE birthday IS NOT NULL AND cid IS NOT NULL PRIMARY KEY (birthday, cid);
これで、出身国または生年月日に基づくクエリーでは、作成された新しいマテリアライズド・ビューを使用できます。
SELECT age, name, birthday FROM cyclist_by_country WHERE country = 'Netherlands'; SELECT age, name, birthday FROM cyclist_by_birthday WHERE birthday = '1987-09-04';

別のINSERTをcyclist_mvテーブルに対して実行すると、ベース・テーブルと、上の例で作成された3つすべてのマテリアライズド・ビューの両方が更新されます。ベース・テーブルからデータを削除すると、影響を受けたマテリアライズド・ビューからもそのデータが削除されます。

マテリアライズド・ビューでは、通常のCassandra読み取りパスを使用してデータを高速でルックアップできます。ただし、マテリアライズド・ビューを更新するために追加の「書き込み前の読み取り」を実行する必要があるため、マテリアライズド・ビューには通常のテーブル書き込みと同じ書き込みパフォーマンスはありません。さらに、更新を実行する前に各レプリカでのデータ整合性チェックを完了する必要があります。マテリアライズド・ビューの更新を含む書き込みでは、レイテンシーが発生します。また、データを削除するときには、パフォーマンスが低下する可能性があります。ベース・テーブルに1つ、各マテリアライズド・ビューに1つ、複数のトゥームストーンが作成されます。

マテリアライズド・ビューは、ベース・テーブルにデータが挿入された後、非同期で構築され、データの更新で遅延を引き起こす場合があります。データは、マテリアライズド・ビューに直接書き込むことはできません。直接書き込みができるのは、ベース・テーブルのみです。ベース・テーブルに対して読み取りリペアが行われ、その結果、マテリアライズド・ビューがリペアされます。

マテリアライズド・ビューの仕組みの詳細については、「New in Cassandra 3.0: Materialized Views」と「Cassandra Summit 2015 talk on Materialized Views」を参照してください。