Amazon Redshift は、2026 年 6 月 30 日以降、Python UDF の使用をサポートしなくなります。これは段階的に実施されます。Python のサポート終了と移行オプションの詳細については、2025 年 6 月 30 日に公開されたブログ記事
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
次の構文は、データを Apache Iceberg テーブルとして保存するマテリアライズドビューを作成します。詳細については、「Apache Iceberg テーブルとして保存されているマテリアライズドビュー」を参照してください。
CREATE MATERIALIZED VIEW mv_name
USING ICEBERG
[LOCATION 's3://bucket/path/']
[PARTITIONED BY (partition_transform [, ...])]
[TABLE PROPERTIES ('property_name' = 'property_value' [, ...])]
AS query
partition_transform は次のようになります。
column_name |
YEAR( column_name ) |
MONTH( column_name ) |
DAY( column_name ) |
HOUR( column_name ) |
BUCKET( integer, column_name ) |
TRUNCATE( integer, column_name )
パラメータ
- BACKUP
-
マテリアライズドビューを自動および手動クラスタースナップショットに含めるかどうかを指定する句。
重要なデータを含まないマテリアライズドビューについては、スナップショットの作成やスナップショットからの復元にかかる時間を節約し、Amazon Simple Storage Service のストレージスペースを節約するため、BACKUP NO を指定します。BACKUP NO の設定は、クラスター内の別ノードへのデータの自動レプリケーションには影響しません。そのため、BACKUP NO が指定されたマテリアライズドビューはノードの障害時に回復されます。デフォルトは BACKUP YES です。
- table_attributes
-
マテリアライズドビュー内のデータの分散方法を指定する句。これには、以下が含まれます。
- AS query
-
マテリアライズドビューとその内容を定義する有効な
SELECTステートメント。クエリからの結果は、マテリアライズドビューの列および行を定義します。マテリアライズドビューの作成時の制約事項については、「制限事項」を参照してください。また、クエリで使用する特定の SQL 言語の構造によって、マテリアライズドビューを増分更新できるかフル更新できるかが決まります。更新方法の詳細については、「REFRESH MATERIALIZED VIEW」を参照してください。増分更新の制約事項については、「増分更新の制約事項」を参照してください。
クエリに増分更新をサポートしていない SQL コマンドが含まれている場合、Amazon Redshift ではマテリアライズドビューがフル更新を使用することを示すメッセージが表示されます。このメッセージは、SQL クライアントアプリケーションによって表示される場合と表示されない場合があります。マテリアライズドビューで使用されている更新のタイプについては、STV_MV_INFOの
state列を確認してください。 - AUTO REFRESH
-
マテリアライズドビューを、そのベーステーブルからの最新の変更で自動的に更新する必要があるかどうかを定義する句。デフォルト値は
NOです。詳細については、「マテリアライズドビューの更新」を参照してください。 - USING ICEBERG
-
マテリアライズドビューがデータを Apache Iceberg テーブルとして Amazon S3 に保存することを指定します。USING ICEBERG を指定すると、マテリアライズドビューデータは Iceberg 形式で Parquet ファイルとして書き込まれ、AWS Glue Data Catalog に登録されます。詳細については、「Apache Iceberg テーブルとして保存されているマテリアライズドビュー」を参照してください。
- mv_name
-
USING ICEBERG を使用する場合、マテリアライズドビュー名は、カタログ修飾表記を使用する必要があります。3 つの部分からなる表記 (
awsdatacatalog.)、Amazon S3 Tables 表記 (database.mv_name")、または 2 つの部分からなる表記と外部スキーマ (bucket@s3tablescatalog".database.mv_name) を使用できます。データベースは AWS Glue Data Catalog に存在する必要があります。external_schema.mv_name - LOCATION
-
Iceberg データおよびメタデータファイルが保存されている Amazon S3 パス。パスは空の場所を指す必要があります。Amazon S3 バケットは、Amazon Redshift クラスターまたはワークグループと同じ AWS リージョンに存在する必要があります。Amazon S3 Tables はストレージの場所を自動的に管理するため、Amazon S3 テーブルバケットを使用する場合は、このパラメータを省略します。外部スキーマまたは
awsdatacatalogルートカタログを使用して作成されたテーブルの場合、LOCATION は必須です。 - PARTITIONED BY (partition_transform [, ...])
-
マテリアライズドビューの Iceberg パーティション変換を 1 つ以上指定します。Amazon Redshift は、
voidを除くすべての Iceberg v2 パーティション変換をサポートしています。1 つの列を複数の変換に表示することはできません。 - TABLE PROPERTIES ('property_name' = 'property_value' [, ...])
-
Iceberg テーブルのプロパティを指定します。例えば、
'write.parquet.compression-codec' = 'zstd'を使用して Parquet 圧縮コーデックを設定します。
使用に関する注意事項
マテリアライズドビューを作成するには、次の権限が必要です。
-
スキーマの CREATE 権限。
-
マテリアライズドビューを作成するためのベーステーブルに対するテーブルレベルまたは列レベルの SELECT 権限。特定の列に対する列レベルの権限がある場合は、それらの列にのみマテリアライズドビューを作成することができます。
mv_name で外部データベース名を指定することで、リモートデータ共有クラスターからマテリアライズドビューを作成できます。
Iceberg マテリアライズドビュー
Iceberg マテリアライズドビューを作成するには、ターゲットの AWS Glue Data Catalog データベースに CREATE TABLE アクセス許可が必要です。外部スキーマに関連付けられた IAM ロール (MV 定義ロール) には、クエリで参照されるすべてのソーステーブルに対する SELECT アクセス許可が必要です。
マテリアライズドビュー定義のすべての識別子 (テーブル名、列名、エイリアス) は小文字である必要があります。AWS Glue Data Catalog は Hive との互換性のために識別子を小文字で保存します。Amazon Redshift は、大文字の識別子を含む USING ICEBERG を使用した CREATE MATERIALIZED VIEW ステートメントを拒否します。
enable_case_sensitive_identifier が true に設定されている場合、Iceberg マテリアライズドビューの作成または更新はサポートされません。この制限は、AWS Glue Data Catalog が大文字と小文字を区別する識別子をサポートしていないため存在します。クラスターまたはワークグループで enable_case_sensitive_identifier が有効になっている場合は、Iceberg マテリアライズドビューを作成または更新する前に、セッションで false に設定してください。
SET enable_case_sensitive_identifier TO false;
ソーステーブルは Apache Iceberg 形式バージョン 2 以下である必要があります。Iceberg 以外のテーブルを Iceberg マテリアライズドビューのソーステーブルとして使用することはできません。
Iceberg マテリアライズドビューでは、以下を使用できません。
BACKUP 句
DISTSTYLE、DISTKEY、または SORTKEY 句
Amazon Redshift ネイティブテーブル、一時テーブル、またはシステムテーブルの参照
AUTO REFRESH (自動更新はサポートされていません。Iceberg マテリアライズドビューを手動で更新してください)
Iceberg マテリアライズドビューの機能と制限の詳細については、「Apache Iceberg テーブルとして保存されているマテリアライズドビュー」を参照してください。
データ共有内のマテリアライズドビューの増分更新
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 を使用した場合にのみ実行されます。詳細については、「テーブルを分析する」を参照してください。
-
RLS で保護されたテーブルまたは DDM で保護されたテーブル。
-
リモートデータ共有クラスターからのマテリアライズドビューの作成は、他のマテリアライズドビュー、Spectrum テーブル、異なる Redshift クラスターおよび UDF で定義されたテーブルのリファレンスをサポートしていません。これらは、ローカル (プロデューサー) クラスターからのマテリアライズドビューの作成でサポートされています。
USING ICEBERG を使用して作成された Iceberg マテリアライズドビューには、次の追加の制限が適用されます。
ソーステーブルは Apache Iceberg 形式である必要があります。
すべての識別子を小文字にする必要があります。
ユーザー定義関数と変更可能な関数は使用できません。
ソーステーブルは、マテリアライズドビューと同じ AWS リージョンとアカウントにある必要があります。
AWS Lake Formation でフィルタリングされた (FGAC) テーブルをソーステーブルとして使用することはできません。
例
次の例では、結合および集計された 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 コマンドの詳細については、以下のトピックを参照してください。
次の例では、パーティション分割を使用して Amazon S3 テーブルバケットに Iceberg マテリアライズドビューを作成します。
CREATE MATERIALIZED VIEW "my-bucket@s3tablescatalog".analytics.sales_by_region USING ICEBERG PARTITIONED BY (region) AS SELECT region, count(*) as order_count, sum(amount) as total_sales FROM "my-bucket@s3tablescatalog".production.orders GROUP BY region;
次の例では、パーティション変換と圧縮が指定された汎用 Amazon S3 バケットに Iceberg マテリアライズドビューを作成します。
CREATE MATERIALIZED VIEW awsdatacatalog.mydb.daily_revenue USING ICEBERG LOCATION 's3://my-analytics-bucket/mvs/daily_revenue/' PARTITIONED BY (day(order_date)) TABLE PROPERTIES ('write.parquet.compression-codec' = 'zstd') AS SELECT order_date, sum(amount) as revenue, count(*) as num_orders FROM awsdatacatalog.mydb.orders GROUP BY order_date;
次の例では、2 つの部分からなる外部スキーマを使用して Iceberg マテリアライズドビューを作成します。
CREATE MATERIALIZED VIEW my_ext_schema.customer_totals USING ICEBERG LOCATION 's3://my-analytics-bucket/mvs/customer_totals/' AS SELECT customer_id, count(*) as order_count, sum(amount) as total_spent FROM my_ext_schema.orders GROUP BY customer_id;