マテリアライズド・ビューの作成
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です。
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';
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」を参照してください。