マテリアライズド・ビューの作成
CREATE MATERIALIZED VIEWコマンドを使用してマテリアライズド・ビューを作成します。
マテリアライズド・ビューは、カーディナリティが高いデータに適しています。マテリアライズド・ビューのデータは、ビューのプライマリ・キーに基づいて連続して配置されます。カーディナリティが低いデータを挿入すると、マテリアライズド・ビューではホットスポットが生じます。
セカンダリ・インデックスは、カーディナリティが低いデータに適しています。セカンダリ・インデックスに対してカーディナリティが高いカラムのクエリーを実行するには、データベースがクラスター内のすべてのノードにアクセスする必要があるため、読み取りレイテンシーが高くなります。
マテリアライズド・ビューに関する制限事項
- マテリアライズド・ビューのプライマリ・キーにソース・テーブルのプライマリ・キーをすべて含めます。
- マテリアライズド・ビューのプライマリ・キーに追加できるカラムは1つのみです。静的カラムは使用できません。
- マテリアライズド・ビューのプライマリ・キー・カラムでNull値を持つ行を除外します。
マテリアライズド・ビューは、独自のWHERE条件とプロパティを使用して作成できます。
マテリアライズド・ビューの例
以下のテーブルは、マテリアライズド・ビューの例の元のテーブル(ソース・テーブル)です。
CREATE TABLE cyclist_mv (cid UUID PRIMARY KEY, name text, age int, birthday date, country text);
このテーブルには、複数のサイクリストの名前、年齢、生年月日、および所属国の値が格納されています。cid | age | birthday | country | name
--------------------------------------+-----+------------+---------------+-------------------
ffdfa2a7-5fc6-49a7-bfdc-3fcdcfdd7156 | 18 | 1997-02-08 | Netherlands | Pascal EENKHOORN
15a116fc-b833-4da6-ab9a-4a7775752836 | 18 | 1997-08-19 | United States | Adrien COSTA
e7ae5cf3-d358-4d99-b900-85902fda9bb0 | 22 | 1993-06-18 | New Zealand | Alex FRAME
c9c9c484-5e4a-4542-8203-8d047a01b8a8 | 27 | 1987-09-04 | Brazil | Cristian EGIDIO
d1aad83b-be60-47a4-bd6e-069b8da0d97b | 27 | 1987-09-04 | Germany | Johannes HEIDER
862cc51f-00a1-4d5a-976b-a359cab7300e | 20 | 1994-09-04 | Denmark | Joakim BUKDAL
18f471bf-f631-4bc4-a9a2-d6f6cf5ea503 | 18 | 1997-03-29 | Netherlands | Bram WELTEN
220844bf-4860-49d6-9a4b-6b5d3a79cbfb | 38 | 1977-07-08 | Italy | Paolo TIRALONGO
6ab09bec-e68e-48d9-a5f8-97e6fb4c9b47 | 28 | 1987-06-07 | Netherlands | Steven KRUIKSWIJK
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はクラスター化カラムです。
新しいマテリアライズド・ビューはageでパーティション分割されているため、サイクリストの年齢に基づいたクエリーに対応します。
SELECT age, name, birthday FROM cyclist_by_age WHERE age = 18;
age | name | birthday
-----+------------------+------------
18 | Adrien COSTA | 1997-08-19
18 | Bram WELTEN | 1997-03-29
18 | Pascal EENKHOORN | 1997-02-08
同じソース・テーブルに基づく別のマテリアライズド・ビューで、サイクリストの生年月日や出身国ごとに情報を整理することができます。
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';
age | name | birthday
-----+-------------------+------------
18 | Bram WELTEN | 1997-03-29
28 | Steven KRUIKSWIJK | 1987-06-07
18 | Pascal EENKHOORN | 1997-02-08
SELECT age, name, birthday FROM cyclist_by_birthday WHERE birthday = '1987-09-04';
age | name | birthday
-----+-----------------+------------
27 | Cristian EGIDIO | 1987-09-04
27 | Johannes HEIDER | 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);
このマテリアライズド・ビューには、以下のように
WHERE
句が追加されているため、オランダのサイクリストに関する情報のみが格納されます。AND country = 'Netherlands'
また、特定の生年月日のオランダのサイクリストを検索するクエリーを発行できます。
SELECT age, name, birthday FROM cyclist_by_birthday WHERE birthday = '1997-02-08';
age | name | birthday | country
-----+------------------+-------------------------
18 | Pascal EENKHOORN | 1997-02-08 | Netherlands
別のINSERTがcyclist_mv
テーブルで実行されると、ソース・テーブルと両方のマテリアライズド・ビューが更新されます。データがこのテーブルから削除されると、関連するマテリアライズド・ビューから同じデータが削除されます。
DSEは、マテリアライズド・ビューではなくソース・テーブルにのみ直接データを書き込めます。データをソース・テーブルに挿入した後、マテリアライズド・ビューが非同期で更新されるため、マテリアライズド・ビューの更新には遅延が生じます。マテリアライズド・ビューの読み取りリペア操作は、ソース・テーブルの更新後にのみ実行されます。