CREATE MATERIALIZED VIEW
1 つ以上の Amazon Redshift テーブルに基づいてマテリアライズドビューを作成します。また、Spectrum やフェデレーションクエリを使用して作成した外部テーブルに基づいてマテリアライズドビューを作成することもできます。Spectrum の詳細については、「Amazon Redshift Spectrum を使用した外部データのクエリ」を参照してください。フェデレーションクエリの詳細については、「Amazon Redshift での横串検索を使用したデータのクエリの実行」を参照してください。
構文
CREATE MATERIALIZED VIEW mv_name [ BACKUP { YES | NO } ] [ table_attributes ] [ AUTO REFRESH { YES | NO } ] AS query
パラメータ
- BACKUP
-
Amazon S3 に保存されている自動または手動クラスタースナップショットにマテリアライズドビューが含まれているか確認する句。
BACKUP
のデフォルト値はYES
です。BACKUP NO
を指定すると、スナップショットの作成時およびスナップショットからの復元時の処理時間を節約し、Amazon S3 に必要なストレージ量を削減できます。注記
BACKUP NO
の設定は、クラスター内の別ノードへのデータの自動複製には影響しません。そのため、BACKUP NO
が指定されたテーブルはノードの障害時に回復します。 - table_attributes
-
マテリアライズドビュー内のデータの分散方法を指定する句。これには、以下が含まれます。
- AS query
-
マテリアライズドビューとその内容を定義する有効な
SELECT
ステートメント。クエリからの結果は、マテリアライズドビューの列および行を定義します。マテリアライズドビューの作成時の制約事項については、「制限事項」を参照してください。また、クエリで使用する特定の SQL 言語の構造によって、マテリアライズドビューを増分更新できるかフル更新できるかが決まります。更新方法の詳細については、「REFRESH MATERIALIZED VIEW」を参照してください。増分更新の制約事項については、「増分更新の制約事項」を参照してください。
クエリに増分更新をサポートしていない SQL コマンドが含まれている場合、Amazon Redshift ではマテリアライズドビューがフル更新を使用することを示すメッセージが表示されます。このメッセージは、SQL クライアントアプリケーションによって表示される場合と表示されない場合があります。マテリアライズドビューで使用されている更新のタイプについては、STV_MV_INFOの
state
列を確認してください。 - AUTO REFRESH
-
マテリアライズドビューを、そのベーステーブルからの最新の変更で自動的に更新する必要があるかどうかを定義する句。デフォルト値は
NO
です。詳細については、「マテリアライズドビューの更新」を参照してください。
使用に関する注意事項
マテリアライズドビューを作成するには、次の権限が必要です。
-
スキーマの CREATE 権限。
-
マテリアライズドビューを作成するためのベーステーブルに対するテーブルレベルまたは列レベルの SELECT 権限。特定の列に対する列レベルの権限がある場合は、それらの列にのみマテリアライズドビューを作成することができます。
データ共有内のマテリアライズドビューの増分更新
Amazon Redshift は、ベーステーブルを共有している場合、コンシューマーデータ共有でのマテリアライズドビューの自動更新と増分更新をサポートしています。増分更新は、Amazon Redshift が前回の更新後に発生したベーステーブルの変更を特定し、マテリアライズドビューの対応するレコードのみを更新する操作です。これにより、フル更新と比べて、実行が迅速化し、ワークロードのパフォーマンスが向上します。増分更新を利用するために、マテリアライズドビュー定義を変更する必要はありません。
マテリアライズドビューによる増分更新を利用する場合、次の 2 つの注意すべき制限があります。
マテリアライズドビューは、ローカルまたはリモートの 1 つのデータベースのみを参照する必要があります。
増分更新は、新しいマテリアライズドビューでのみ使用できます。したがって、増分更新を行うには、既存のマテリアライズドビューを削除して再作成する必要があります。
データ共有でのマテリアライズドビューの作成の詳細については、「Amazon Redshift データ共有でのビューの使用」を参照してください。これには、いくつかのクエリ例も含まれています。
マテリアライズドビューまたはベーステーブルの DDL の更新
Amazon Redshift でマテリアライズドビューを使用する場合は、マテリアライズドビューまたはベーステーブルのデータ定義言語 (DDL) の更新に関する以下の注意事項に従ってください。
-
ベーステーブルを参照するマテリアライズドビューに影響を与えることなく、ベーステーブルに列を追加できます。
-
操作によっては、マテリアライズドビューをまったく更新できない状態になる場合があります。該当する操作として、名前の変更、列の削除、列の種類の変更、スキーマ名の変更などがあります。このようなオペレーションが行われたマテリアライズドビューは、クエリできますが更新できません。この場合、マテリアライズドビューを削除または再作成する必要があります。
-
一般的に、マテリアライズドビューの定義 (SQL ステートメント) は変更できません。
-
マテリアライズドビューの名前は変更できません。
制限事項
次のものを参照する、または含むマテリアライズドビューは定義できません。
-
標準ビュー、またはシステムテーブルとビュー。
-
一時テーブル。
-
ユーザー定義関数。
-
ORDER BY 句、LIMIT 句、OFFSET 句。
-
ベーステーブルの遅延バインディングの参照。つまり、マテリアライズドビューを定義する SQL クエリで参照されるベーステーブルや関連列は存在し、有効である必要があります。
-
リーダーノードのみの関数: CURRENT_SCHEMA、CURRENT_SCHEMAS、HAS_DATABASE_PRIVILEGE、HAS_SCHEMA_PRIVILEGE、HAS_TABLE_PRIVILEGE。
マテリアライズドビューの定義の中に、変更可能な関数または外部スキーマが含まれている場合、AUTO REFRESH YES オプションは使用できません。また、別のマテリアライズドビューに基づいてマテリアライズドビューを定義する場合にも使用できません。
マテリアライズドビューで ANALYZE を手動で実行する必要はありません。これは現在のところ、AUTO ANALYZE でのみ発生しています。詳細については、「テーブルを分析する」を参照してください。
例
次の例では、結合および集計された 3 つのベーステーブルからマテリアライズドビューを作成します。各行は、カテゴリと販売されたチケット数を表します。tickets_mv マテリアライズドビューのクエリを実行すると、tickets_mv マテリアライズドビューの計算済みのデータに直接アクセスします。
CREATE MATERIALIZED VIEW tickets_mv AS select catgroup, sum(qtysold) as sold from category c, event e, sales s where c.catid = e.catid and e.eventid = s.eventid group by catgroup;
以下の例は、前の例と同様のマテリアライズドビューを作成し、集計関数 MAX() を使用します。
CREATE MATERIALIZED VIEW tickets_mv_max AS select catgroup, max(qtysold) as sold from category c, event e, sales s where c.catid = e.catid and e.eventid = s.eventid group by catgroup; SELECT name, state FROM STV_MV_INFO;
次の例では、UNION ALL 句を使用して Amazon Redshift public_sales
テーブルと Redshift Spectrum spectrum.sales
テーブルを結合し、mv_sales_vw
マテリアルビューを作成します。Amazon Redshift Spectrum の CREATE EXTERNAL TABLE コマンドの詳細については、CREATE EXTERNAL TABLE を参照してください。Redshift Spectrum 外部テーブルは、Amazon S3 のデータを参照します。
CREATE MATERIALIZED VIEW mv_sales_vw as select salesid, qtysold, pricepaid, commission, saletime from public.sales union all select salesid, qtysold, pricepaid, commission, saletime from spectrum.sales
次の例では、横串検索の外部テーブルに基づいてマテリアライズドビュー mv_fq
を作成します。フェデレーションクエリの詳細については、「CREATE EXTERNAL SCHEMA」を参照してください。
CREATE MATERIALIZED VIEW mv_fq as select firstname, lastname from apg.mv_fq_example; select firstname, lastname from mv_fq; firstname | lastname -----------+---------- John | Day Jane | Doe (2 rows)
次の例は、マテリアライズドビューの定義を示しています。
SELECT pg_catalog.pg_get_viewdef('mv_sales_vw'::regclass::oid, true); pg_get_viewdef --------------------------------------------------- create materialized view mv_sales_vw as select a from t;
次のサンプルは、マテリアライズドビューの定義で AUTO REFRESH を設定する方法を示しています。また DISTSTYLE を指定しています。まず、簡単なベーステーブルを作成します。
CREATE TABLE baseball_table (ball int, bat int);
次に、マテリアライズドビューを作成します。
CREATE MATERIALIZED VIEW mv_baseball DISTSTYLE ALL AUTO REFRESH YES AS SELECT ball AS baseball FROM baseball_table;
これで mv_baseball マテリアライズドビューをクエリできるようになりました。マテリアライズドビューの AUTO REFRESH がオンになっているかどうかを確認するには、「STV_MV_INFO」を参照してください。
次のサンプルでは、別のデータベースのソーステーブルを参照するマテリアライズドビューを作成します。ソーステーブル database_A を含むデータベースが、database_B で作成したマテリアライズドビューと同じクラスターまたはワークグループにあることを前提としています (サンプルの代わりに独自のデータベースを使用できます)。まず、database_A に、cityname 列がある、cities という名前のテーブルを作成します。列のデータ型を VARCHAR にします。ソーステーブルを作成したら、database_B で次のコマンドを実行して、cities テーブルをソースとするマテリアライズドビューを作成します。FROM 句に必ずソーステーブルのデータベースとスキーマを指定してください。
CREATE MATERIALIZED VIEW cities_mv AS SELECT cityname FROM database_A.public.cities;
作成したマテリアライズドビューをクエリします。クエリは、元のソースが database_A の cities テーブルであるレコードを取得します。
select * from cities_mv;
SELECT ステートメントを実行すると、cities_mv はレコードを返します。REFRESH ステートメントが実行されたときにのみ、レコードはソーステーブルから更新されます。また、マテリアライズドビューでレコードを直接更新できないことに注意してください。マテリアライズドビューのデータを更新する方法については、REFRESH MATERIALIZED VIEW を参照してください。
マテリアライズドビューの概要およびマテリアライズドビューの更新や削除に使用する SQL コマンドの詳細については、以下のトピックを参照してください。