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

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

DataStax Enterprise 5.0以降では、マテリアライズド・ビューとは、別のテーブルのデータを使用し、新しいプライマリ・キーと新しいプロパティを指定して構築したテーブルを指します。クエリーはプライマリ・キー定義によって最適化されます。クエリーに対しテーブルを作成するのが一般的ですが、別のクエリーが必要な場合は、同じデータで新しいテーブルを作成します。クライアント・アプリケーションでは追加のテーブルと元のテーブルを手動で更新しますが、マテリアライズド・ビューのデータは、ソース・テーブルを変更すると自動的に更新されます。

セカンダリ・インデックスは、カーディナリティが低いデータに適しています。セカンダリ・インデックスに対してカーディナリティが高いカラムのクエリーを実行するには、データベースがクラスター内のすべてのノードにアクセスする必要があるため、読み取りレイテンシーが高くなります

マテリアライズド・ビューは、カーディナリティが高いデータに適しています。マテリアライズド・ビューのデータは、ビューのプライマリ・キーに基づいて連続して配置されます。カーディナリティが低いデータを挿入すると、マテリアライズド・ビューではホットスポットが生じます。

マテリアライズド・ビューに関する制限事項
  • マテリアライズド・ビューのプライマリ・キーにソース・テーブルのプライマリ・キーをすべて含めます。
  • マテリアライズド・ビューのプライマリ・キーに追加できるカラムは1つのみです。静的カラムは使用できません。
  • MVプライマリ・キー・カラムにNull値を持つ行を除外します。

マテリアライズド・ビューは、独自のWHERE条件とプロパティを使用して作成できます。

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

以下のテーブルは、このセクションで使用されるマテリアライズド・ビューの例の元のテーブル(ソース・テーブル)です。
CREATE TABLE cyclist_mv (cid UUID PRIMARY KEY, name text, age int, birthday date, country text);
このテーブルには、複数のサイクリストの名前、年齢、生年月日、および所属国の値が格納されています。
cyclist_mvテーブルに基づいて、プライマリ・キーのageを使用するマテリアライズド・ビューを作成することができます。
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が含まれている必要があります。
    注: このマテリアライズド・ビューでは、プライマリ・キーとしてageを使用し、cidはクラスター化カラムです。DataStax Enterprise 5.0以前では、クラスター化カラムの最大サイズは64 KBです。
新しいマテリアライズド・ビューはageでパーティション分割されているため、サイクリストの年齢に基づいたクエリーに対応します。
SELECT age, name, birthday FROM cyclist_by_age WHERE age = 18;
同じソース・テーブルに基づく別のマテリアライズド・ビューで、サイクリストの生年月日や出身国ごとに情報を整理することができます。
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);

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);
以下のクエリーでは、新しいマテリアライズド・ビューを使用します。
SELECT age, name, birthday FROM cyclist_by_country WHERE country = 'Netherlands';
SELECT age, name, birthday FROM cyclist_by_birthday WHERE birthday = '1987-09-04';
DataStax Enterprise 5.1以降では、非プライマリ・キー・カラムに関する制限を含むフィルター処理の文を使用してマテリアライズド・ビューを作成できます。
CREATE MATERIALIZED VIEW cyclist_by_birthday_Netherlands 
AS SELECT age, birthday, name, country 
FROM cyclist_mv 
WHERE birthday IS NOT NULL AND cid IS NOT NULL
AND country='Netherlands'
PRIMARY KEY (birthday, cid);
このマテリアライズド・ビューは、
AND country='Netherlands'
WHERE句に追加することで、出身国がオランダ(Netherlands)のサイクリストの情報のみを格納します。また、特定の生年月日のオランダのサイクリストを検索するクエリーを発行できます。
SELECT age, name, birthday FROM cyclist_by_birthday WHERE birthday = '1997-02-08';

別のINSERTがcyclist_mvで実行されると、ソース・テーブルと両方のマテリアライズド・ビューが更新されます。データがcyclist_mvから削除されると、関連するマテリアライズド・ビューから同じデータが削除されます。

マテリアライズド・ビューでは、通常の読み取りパスを使用してデータを高速でルックアップできます。ただし、各マテリアライズド・ビューを更新するために追加の「書き込み前の読み取り」が実行されるため、マテリアライズド・ビューの書き込みパフォーマンスは通常のテーブル書き込みと同等ではありません。更新を完了するため、各レプリカでデータ整合性チェックが行われます。ソース・テーブルへの書き込みでは、レイテンシーが発生します。ソース・テーブルに対する削除パフォーマンスも低下します。ソース・テーブルに対する削除が複数の連続する行に影響を及ぼす場合、この削除は1つのトゥームストーンでタグ付けされます。ただし、ソース・テーブルから派生したマテリアライズド・ビューでは、これらの同じ行が連続していない場合があります。その場合、マテリアライズド・ビューでは複数のトゥームストーンが作成されます。

DataStax Enterpriseでは、ソース・テーブルにデータを直接書き込むことはできますが、マテリアライズド・ビューに書き込むことはできません。データをソース・テーブルに挿入した後、マテリアライズド・ビューが非同期で更新されるため、マテリアライズド・ビューの更新には遅延が生じます。マテリアライズド・ビューの読み取りリペアは、ソース・テーブルを更新した後で実行されます。

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