

 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/)を参照してください。

# マテリアライズドビューの更新
<a name="materialized-view-refresh"></a>

このトピックでは、基になるテーブルからマテリアルビューのデータを更新する方法について説明します。

マテリアライズドビューを作成する際、そのコンテンツには、その時点での基となるデータベースリレーション (テーブルまたは他のマテリアライズドビュー) の状態が反映されます。基となるテーブルにあるデータが、アプリケーションにより変更されても、マテリアライズドビューのデータは変更されません。マテリアライズドビューのデータを更新する場合は、`REFRESH MATERIALIZED VIEW`ステートメントを使用してマテリアライズドビューを手動で随時更新できます。このステートメントを使用すると、Amazon Redshift は、ベースリレーションで行われた変更を特定してマテリアライズドビューに変更を適用します。

Amazon Redshift には、マテリアライズドビューを更新するための 2 つの方法があります。
+ 多くの場合、Amazon Redshift は、増分更新を実行します。*増分更新*の場合、Amazon Redshift は前回の更新からのベースリレーションのデータに対する変更をすぐに特定し、マテリアライズドビューのデータを更新します。増分更新は、マテリアライズドビューの定義時にクエリで使用する以下の SQL コンストラクトでサポートされています。
  + SELECT 句、FROM 句、[INNER] JOIN 句、WHERE 句、GROUP BY 句、HAVING 句が含まれるコンストラクト。
  + SUM、MIN、MAX、AVG および COUNT などの集計が含まれるコンストラクト。
  + ほとんどの組み込み SQL 関数、特にイミュータブルな関数には、同じ入力引数を持ち、常に同じ出力が生成されることを前提としています。

  増分更新は、データ共有テーブルやマテリアライズドビューに基づくマテリアライズドビューでもサポートされています。
+ 増分更新ができない場合、Amazon Redshift はフル更新を実行します。*フル更新*では、基となる SQL ステートメントを再実行し、マテリアライズドビューにあるすべてのテータを置き換えます。
+ Amazon Redshift は、マテリアライズドビューの定義に使用される SELECT クエリに応じて、マテリアライズドビューの更新方法を自動的に選択します。

## ネストされたマテリアライズドビュー
<a name="materialized-view-refresh-nested"></a>

マテリアライズドビューは、他のマテリアライズドビューの上に定義できます。このようなマテリアライズドビューを更新するには、マテリアライズドビューの最上位の更新で `CASCADE` キーワードを明示的に使用する必要があります。例えば、次のネストされたマテリアライズドビュー構造があるとします。

```
CREATE TABLE t(a INT);
CREATE MATERIALIZED VIEW u AS SELECT * FROM t;
CREATE MATERIALIZED VIEW v AS SELECT * FROM u;
CREATE MATERIALIZED VIEW w AS SELECT * FROM v;

-- w -> v -> u -> t

INSERT INTO t VALUES (1);
```

w を最新の状態にするには、次の 2 つの選択肢があります。
+ (推奨) `REFRESH MATERIALIZED VIEW w CASCADE` コマンドを使用して w を更新します。このコマンドは、1 つのトランザクションですべてのマテリアライズドビューの更新を実行します。
+ u、v、w を個別のコマンドとして、依存関係の順 (最初に u、次に v、最後に w) に更新します。

`CASCADE` キーワードを明示的に使用しない場合、マテリアライズドビューは `RESTRICT` モードで更新され、現在のマテリアライズドビューのみが更新されます。次の例は、古くなったマテリアライズドビューに依存するマテリアライズドビューに対して、`REFRESH MATERIALIZED VIEW` を実行する際に表示される情報メッセージを示しています。

```
REFRESH MATERIALIZED VIEW w;
INFO:  Materialized view w is already up to date.  However, it depends on another materialized view that is not up to date.

REFRESH MATERIALIZED VIEW w CASCADE;
INFO:  Materialized view w was incrementally updated successfully.
```

```
REFRESH MATERIALIZED VIEW v;
INFO: Materialized view v is already up to date. However, it depends on another materialized view that is not up to date.

REFRESH MATERIALIZED VIEW v CASCADE;
INFO: Materialized view v was incrementally updated successfully.
```

カスケード更新オプションを使用した上記の例では、マテリアライズドビュー u が最初に更新され、マテリアライズドビュー v が次に更新され、マテリアライズドビュー w は更新されません。

次の例では、マテリアライズドビューの完全なリフレッシュプランを、プログラム的に作成する方法を示しています。マテリアライズドビュー v をリフレッシュするには、最初にマテリアライズドビュー u をリフレッシュします。マテリアライズドビュー w をリフレッシュするには、まずマテリアライズドビュー u を、次にマテリアライズドビュー v をリフレッシュします。

```
WITH RECURSIVE recursive_deps (mv_tgt, lvl, mv_dep) AS
( SELECT trim(name) as mv_tgt, 0 as lvl, trim(ref_name) as mv_dep
  FROM stv_mv_deps
  UNION ALL
  SELECT R.mv_tgt, R.lvl+1 as lvl, trim(S.ref_name) as mv_dep
  FROM stv_mv_deps S, recursive_deps R
  WHERE R.mv_dep = S.name
)

SELECT mv_tgt, mv_dep from recursive_deps
ORDER BY mv_tgt, lvl DESC;

 mv_tgt | mv_dep
--------+--------
 v      | u
 w      | u
 w      | v
(3 rows)
```

## 制限事項
<a name="materialized-view-refresh-limitations"></a>

Amazon Redshift は、以下を除くソースに基づくマテリアライズドビューのカスケード更新をサポートしていません。
+ ローカルテーブル
+ ローカル MV
+ ストリーミング MV

Amazon Redshift では、現在のところ、次の SQL 要素のいずれかを使用してクエリで定義されたマテリアライズドビューの増分更新はサポートされていません。
+ OUTER JOIN (右、左、またはフル)。
+ 集合演算のセットは、UNION、INTERSECT、EXCEPT、MINUS です。
+ 集計関数は、MEDIAN、PERCENTILE\$1CONT、LISTAGG、STDDEV\$1SAMP、STDDEV\$1POP、APPROXIMATE COUNT、APPROXIMATE PERCENTILE、およびビット単位の集計関数です。
**注記**  
COUNT、SUM および AVG 集計関数がサポートされています。
+ DISTINCT COUNT、DISTINCT SUM などの DISTINCT 集計関数。
+ ウィンドウ関数。
+ 共通部分式の最適化など、クエリの最適化に一時テーブルを使用するクエリ。
+ サブクエリ。
+ マテリアライズドビューを定義するクエリで以下の形式を参照する外部テーブル。
  +  Delta Lake 
  +  Hudi 

  上記以外のフォーマットを使用して定義されたマテリアライズドビューでは、増分更新がサポートされます。詳細については、「[Amazon Redshift Spectrum の外部データレイクテーブルのマテリアライズドビュー外部データレイクテーブルのマテリアライズドビュー](materialized-view-external-table.md)」を参照してください。

## マテリアライズドビューの自動更新
<a name="materialized-view-auto-refresh"></a>

Amazon Redshift は、自動更新オプションを使用してマテリアライズドビューを作成または変更すると、ベーステーブルの最新データでマテリアライズドビューを自動的に更新できます。Amazon Redshift は、ベーステーブルが変更された後、できるだけ早くマテリアライズドビューを自動更新します。

クラスター内のアクティブなワークロードへの影響を最小限に抑えながら、最も重要なマテリアライズドビューの更新を完了するために、Amazon Redshift は複数の要素を考慮します。これらの要素には、現在のシステム負荷、更新に必要なリソース、使用可能なクラスターリソース、マテリアライズドビューの使用頻度が含まれます。

Amazon Redshift は自動更新よりもワークロードの優先順位を設定し、ユーザーのワークロードのパフォーマンスを維持するために自動更新を停止する場合があります。このアプローチでは、一部のマテリアライズドビューの更新が遅れる可能性があります。場合によっては、マテリアライズドビューに対してより決定的な更新動作が必要になることがあります。その場合は、[REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md)で説明されている手動更新、またはAmazon Redshift スケジューラ API オペレーションまたはコンソールを使用したスケジュール更新の使用を検討してください。

CREATE MATERIALIZED VIEW を使用して、マテリアライズドビューの自動更新を設定できます。また、AUTO REFRESH 句を使用して、マテリアライズドビューを自動的に更新することもできます。マテリアライズドビュー作成の詳細については、「[CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md)」を参照してください。現在のマテリアライズドビューの自動更新を有効にするには、[ALTER MATERIALIZED VIEW](r_ALTER_MATERIALIZED_VIEW.md)を使用します。

マテリアライズドビューを更新するときは、次の点を考慮してください。
+ マテリアライズドビューの自動更新を有効にしていない場合でも、REFRESH MATERIALIZED VIEW コマンドを使用してマテリアライズドビューを明示的に更新できます。
+ 自動更新は、データ共有テーブルまたは Iceberg テーブルで定義されたマテリアライズドビューではサポートされますが、2 つの組み合わせではサポートされていません。
+ 更新ステータスについては、SVL\$1MV\$1REFRESH\$1STATUS をチェックできます。これは、ユーザーが開始したクエリまたは自動更新されたクエリを記録します。
+ 再計算専用のマテリアライズドビューで REFRESH を実行するには、スキーマに対する CREATE のアクセス許可が付与されている必要があります。詳細については、「[GRANT](r_GRANT.md)」を参照してください。

 2026 年 2 月 27 日以降、Amazon Redshift マテリアライズドビューの自動 REFRESH クエリは、バックグラウンドの自律プロセスとしてではなく、ユーザークエリとして実行されます。その結果、自動 REFRESH クエリは、他のユーザークエリと同じ優先度で実行されるようになりました。

 この変更により、AUTO REFRESH を有効にしてマテリアライズドビューの鮮度を向上させることで、以前の動作と比較して、ベーステーブルに対する最新の変更が反映されるため、ビューを最新の状態に保つことができます。

 注: MV の AUTO REFRESH の動作変更機能は、Amazon Redshift でプロビジョニングされたクラスターにおいて、パッチリリース P198 以降の CURRENT トラックでのみ有効になります。Serverless では現在無効になっています。