

 Amazon Redshift は、パッチ 198 以降、新しい Python UDF の作成をサポートしなくなります。既存の Python UDF は、2026 年 6 月 30 日まで引き続き機能します。詳細については、[ブログ記事](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)を参照してください。

# CREATE MATERIALIZED VIEW
<a name="materialized-view-create-sql-command"></a>

1 つ以上の Amazon Redshift テーブルに基づいてマテリアライズドビューを作成します。また、Spectrum やフェデレーションクエリを使用して作成した外部テーブルに基づいてマテリアライズドビューを作成することもできます。Spectrum の詳細については、「[Amazon Redshift Spectrum](c-using-spectrum.md)」を参照してください。フェデレーションクエリの詳細については、「[Amazon Redshift での横串検索を使用したデータのクエリの実行](federated-overview.md)」を参照してください。

## 構文
<a name="mv_CREATE_MATERIALIZED_VIEW-synopsis"></a>

```
CREATE MATERIALIZED VIEW mv_name
[ BACKUP { YES | NO } ]
[ table_attributes ]
[ AUTO REFRESH { YES | NO } ]
AS query
```

## パラメータ
<a name="mv_CREATE_MATERIALIZED_VIEW-parameters"></a>

BACKUP  
マテリアライズドビューを自動および手動クラスタースナップショットに含めるかどうかを指定する句。  
重要なデータを含まないマテリアライズドビューについては、スナップショットの作成やスナップショットからの復元にかかる時間を節約し、Amazon Simple Storage Service のストレージスペースを節約するため、BACKUP NO を指定します。BACKUP NO の設定は、クラスター内の別ノードへのデータの自動レプリケーションには影響しません。そのため、BACKUP NO が指定されたマテリアライズドビューはノードの障害時に回復されます。デフォルトは BACKUP YES です。

 *table\$1attributes*   
マテリアライズドビュー内のデータの分散方法を指定する句。これには、以下が含まれます。  
+  `DISTSTYLE { EVEN | ALL | KEY }` の形式のマテリアライズドビュー向けの分散スタイル。この句を省略すると、分散スタイルは `EVEN` になります。詳細については、「[分散スタイル](c_choosing_dist_sort.md)」を参照してください。
+ `DISTKEY ( distkey_identifier )` の形式のマテリアライズドビュー向けの分散キー。詳細については、「[分散スタイルの指定](t_designating_distribution_styles.md)」を参照してください。
+ `SORTKEY ( column_name [, ...] )` の形式のマテリアライズドビュー向けのソートキー。詳細については、「[ソートキー](t_Sorting_data.md)」を参照してください。

AS *query*  
マテリアライズドビューとその内容を定義する有効な `SELECT` ステートメント。クエリからの結果は、マテリアライズドビューの列および行を定義します。マテリアライズドビューの作成時の制約事項については、「[制限事項](#mv_CREATE_MATERIALIZED_VIEW-limitations)」を参照してください。  
また、クエリで使用する特定の SQL 言語の構造によって、マテリアライズドビューを増分更新できるかフル更新できるかが決まります。更新方法の詳細については、「[REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md)」を参照してください。増分更新の制約事項については、「[増分更新の制約事項](materialized-view-refresh-sql-command.md#mv_REFRESH_MARTERIALIZED_VIEW_limitations)」を参照してください。  
クエリに増分更新をサポートしていない SQL コマンドが含まれている場合、Amazon Redshift ではマテリアライズドビューがフル更新を使用することを示すメッセージが表示されます。このメッセージは、SQL クライアントアプリケーションによって表示される場合と表示されない場合があります。マテリアライズドビューで使用されている更新のタイプについては、[STV\$1MV\$1INFO](r_STV_MV_INFO.md)の `state` 列を確認してください。

AUTO REFRESH  
マテリアライズドビューを、そのベーステーブルからの最新の変更で自動的に更新する必要があるかどうかを定義する句。デフォルト値は `NO` です。詳細については、「[マテリアライズドビューの更新](materialized-view-refresh.md)」を参照してください。

## 使用に関する注意事項
<a name="mv_CREATE_MARTERIALIZED_VIEW_usage"></a>

マテリアライズドビューを作成するには、次の権限が必要です。
+ スキーマの CREATE 権限。
+ マテリアライズドビューを作成するためのベーステーブルに対するテーブルレベルまたは列レベルの SELECT 権限。特定の列に対する列レベルの権限がある場合は、それらの列にのみマテリアライズドビューを作成することができます。

 `mv_name` で外部データベース名を指定することで、リモートデータ共有クラスターからマテリアライズドビューを作成できます。

## データ共有内のマテリアライズドビューの増分更新
<a name="mv_CREATE_MARTERIALIZED_VIEW_datashare"></a>

 Amazon Redshift は、ベーステーブルを共有している場合、コンシューマーデータ共有でのマテリアライズドビューの自動更新と増分更新をサポートしています。増分更新は、Amazon Redshift が前回の更新後に発生したベーステーブルの変更を特定し、マテリアライズドビューの対応するレコードのみを更新する操作です。これにより、フル更新と比べて、実行が迅速化し、ワークロードのパフォーマンスが向上します。増分更新を利用するために、マテリアライズドビュー定義を変更する必要はありません。

マテリアライズドビューによる増分更新を利用する場合、次の 2 つの注意すべき制限があります。
+ マテリアライズドビューは、ローカルまたはリモートの 1 つのデータベースのみを参照する必要があります。
+ 増分更新は、新しいマテリアライズドビューでのみ使用できます。したがって、増分更新を行うには、既存のマテリアライズドビューを削除して再作成する必要があります。

データ共有でのマテリアライズドビューの作成の詳細については、[「Amazon Redshift データ共有でのビューの使用](https://docs.aws.amazon.com/redshift/latest/dg/datashare-views)」を参照してください。これには、いくつかのクエリ例も含まれています。

## マテリアライズドビューまたはベーステーブルの DDL の更新
<a name="materialized-view-ddl"></a>

Amazon Redshift でマテリアライズドビューを使用する場合は、マテリアライズドビューまたはベーステーブルのデータ定義言語 (DDL) の更新に関する以下の注意事項に従ってください。
+ ベーステーブルを参照するマテリアライズドビューに影響を与えることなく、ベーステーブルに列を追加できます。
+ 操作によっては、マテリアライズドビューをまったく更新できない状態になる場合があります。該当する操作として、名前の変更、列の削除、列の種類の変更、スキーマ名の変更などがあります。このようなオペレーションが行われたマテリアライズドビューは、クエリできますが更新できません。この場合、マテリアライズドビューを削除または再作成する必要があります。
+ 一般的に、マテリアライズドビューの定義 (SQL ステートメント) は変更できません。
+ マテリアライズドビューの名前は変更できません。

## 制限事項
<a name="mv_CREATE_MATERIALIZED_VIEW-limitations"></a>

次のものを参照する、または含むマテリアライズドビューは定義できません。
+ 標準ビュー、またはシステムテーブルとビュー。
+ 一時テーブル。
+ ユーザー定義関数。
+ ORDER BY 句、LIMIT 句、OFFSET 句。
+ ベーステーブルへの遅延バインディングの参照。つまり、マテリアライズドビューを定義する SQL クエリで参照されるベーステーブルや関連列は存在し、有効である必要があります。
+ リーダーノードのみの関数: CURRENT\$1SCHEMA、CURRENT\$1SCHEMAS、HAS\$1DATABASE\$1PRIVILEGE、HAS\$1SCHEMA\$1PRIVILEGE、HAS\$1TABLE\$1PRIVILEGE。
+ マテリアライズドビューの定義の中に、変更可能な関数または外部スキーマが含まれている場合、AUTO REFRESH YES オプションは使用できません。また、別のマテリアライズドビューに基づいてマテリアライズドビューを定義する場合にも使用できません。
+ マテリアライズドビューで [ANALYZE](r_ANALYZE.md) を手動で実行する必要はありません。これは現在のところ、AUTO ANALYZE でのみ発生しています。詳細については、「[テーブルを分析する](t_Analyzing_tables.md)」を参照してください。
+ RLS で保護されたテーブルまたは DDM で保護されたテーブル。
+ リモートデータ共有クラスターからのマテリアライズドビューの作成は、他のマテリアライズドビュー、Spectrum テーブル、異なる Redshift クラスターおよび UDF で定義されたテーブルのリファレンスをサポートしていません。これらは、ローカル (プロデューサー) クラスターからのマテリアライズドビューの作成でサポートされています。

## 例
<a name="mv_CREATE_MARTERIALIZED_VIEW_examples"></a>

次の例では、結合および集計された 3 つのベーステーブルからマテリアライズドビューを作成します。各行は、カテゴリと販売されたチケット数を表します。tickets\$1mv マテリアライズドビューのクエリを実行すると、tickets\$1mv マテリアライズドビューの計算済みのデータに直接アクセスします。

```
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](r_CREATE_EXTERNAL_TABLE.md) を参照してください。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](r_CREATE_EXTERNAL_SCHEMA.md)」を参照してください。

```
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\$1baseball マテリアライズドビューをクエリできるようになりました。マテリアライズドビューの AUTO REFRESH がオンになっているかどうかを確認するには、「[STV\$1MV\$1INFO](r_STV_MV_INFO.md)」を参照してください。

次のサンプルでは、別のデータベースのソーステーブルを参照するマテリアライズドビューを作成します。ソーステーブル database\$1A を含むデータベースが、database\$1B で作成したマテリアライズドビューと同じクラスターまたはワークグループにあることを前提としています (サンプルの代わりに独自のデータベースを使用できます)。まず、database\$1A に、*cityname* 列がある、*cities* という名前のテーブルを作成します。列のデータ型を VARCHAR にします。ソーステーブルを作成したら、database\$1B で次のコマンドを実行して、*cities* テーブルをソースとするマテリアライズドビューを作成します。FROM 句に必ずソーステーブルのデータベースとスキーマを指定してください。

```
CREATE MATERIALIZED VIEW cities_mv AS
SELECT  cityname
FROM    database_A.public.cities;
```

作成したマテリアライズドビューをクエリします。クエリは、元のソースが database\$1A の *cities* テーブルであるレコードを取得します。

```
select * from cities_mv;
```

SELECT ステートメントを実行すると、*cities\$1mv* はレコードを返します。REFRESH ステートメントが実行されたときにのみ、レコードはソーステーブルから更新されます。また、マテリアライズドビューでレコードを直接更新できないことに注意してください。マテリアライズドビューのデータを更新する方法については、[REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md) を参照してください。

マテリアライズドビューの概要およびマテリアライズドビューの更新や削除に使用する SQL コマンドの詳細については、以下のトピックを参照してください。
+ [Amazon Redshift でのマテリアライズドビュー](materialized-view-overview.md)
+ [REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md)
+ [DROP MATERIALIZED VIEW](materialized-view-drop-sql-command.md)