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

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は、マテリアライズド・ビューではなくソース・テーブルにのみ直接データを書き込めます。データをソース・テーブルに挿入した後、マテリアライズド・ビューが非同期で更新されるため、マテリアライズド・ビューの更新には遅延が生じます。マテリアライズド・ビューの読み取りリペア操作は、ソース・テーブルの更新後にのみ実行されます。