マテリアライズドビューの更新 - Amazon Redshift

マテリアライズドビューの更新

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

Amazon Redshift には、マテリアライズドビューを更新するための 2 つの方法があります。

  • 多くの場合、Amazon Redshift は、増分更新を実行します。増分更新では、Amazon Redshift によって前回の更新からのベーステーブルのデータに対する変更がすぐに特定され、マテリアライズドビューのデータが更新されます。増分更新は、マテリアライズドビューの定義時にクエリで使用する以下の SQL コンストラクトでサポートされています。

    • SELECT 句、FROM 句、[INNER] JOIN 句、WHERE 句、GROUP BY 句、HAVING 句が含まれるコンストラクト。

    • SUM、MIN、MAX、および COUNT などの集計が含まれるコンストラクト。

    • ほとんどの組み込み SQL 関数、特にイミュータブルな関数には、同じ入力引数を持ち、常に同じ出力が生成されることを前提としています。

  • 増分更新ができない場合、Amazon Redshift はフル更新を実行します。フル更新では、基となる SQL ステートメントを再実行し、マテリアライズドビューにあるすべてのテータを置き換えます。

  • Amazon Redshift は、マテリアライズドビューの定義に使用される SELECT クエリに応じて、マテリアライズドビューの更新方法を自動的に選択します。

マテリアライズドビュー上のマテリアライズドビューをリフレッシュすることは、縦につながるプロセスではありません。例えば、マテリアライズドビュー B に依存するマテリアライズドビュー A があるとします。この場合、REFRESH MATERIZED VIEW A が呼び出されると、B が古くなっていても、A はその時点の B のバージョンを使用してリフレッシュされます。A を完全に最新にするには、A をリフレッシュする前に、まず別のトランザクションで B をリフレッシュします。

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

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; 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)

次の例は、古くなったマテリアライズドビューに依存するマテリアライズドビューに対して、REFRESH MATERIZED VIEW を実行する際に表示される情報メッセージを示しています。

create table a(a int);
create materialized view b as select * from a;
create materialized view c as select * from b;
insert into a values (1);
refresh materialized view c; INFO: Materialized view c is already up to date. However, it depends on another materialized view that is not up to date.
REFRESH MATERIALIZED VIEW b; INFO: Materialized view b was incrementally updated successfully.
REFRESH MATERIALIZED VIEW c; INFO: Materialized view c was incrementally updated successfully.

Amazon Redshift には、現時点では、マテリアライズドビューの増分更新に関する次の制限があります。

Amazon Redshift では、現在のところ、次の SQL 要素のいずれかを使用してクエリで定義されたマテリアライズドビューの増分更新はサポートされていません。

  • OUTER JOIN (右、左、またはフル)。

  • 集合演算のセットは、UNION、INTERSECT、EXCEPT、MINUS です。

  • 集計関数は、AVG、MEDIAN、PERCENTILE_CONT、LISTAGG、STDDEV_SAMP、STDDEV_POP、APPROXIMATE COUNT、APPROXIMATE PERCENTILE、およびビット単位の集計関数です。

    注記

    COUNT および SUM 集計関数がサポートされています。

  • DISTINCT COUNT、DISTINCT SUM などの DISTINCT 集計関数。

  • ウィンドウ関数。

  • 共通部分式の最適化など、クエリの最適化に一時テーブルを使用するクエリ。

  • FROM 句以外にあるサブクエリ

  • マテリアライズドビューを定義するクエリでベーステーブルとして参照される外部テーブル。

マテリアライズドビューの自動更新

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

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

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

CREATE MATERIALIZED VIEW を使用して、マテリアライズドビューの自動更新を設定できます。また、AUTO REFRESH 句を使用して、マテリアライズドビューを自動的に更新することもできます。マテリアライズドビュー作成の詳細については、CREATE MATERIALIZED VIEW を参照してください。ALTER MATERIALIZED VIEW を使用して、現在のマテリアライズドビューの自動更新を有効にできます。

マテリアライズドビューを更新するときは、次の点を考慮してください。

  • マテリアライズドビューの自動更新を有効にしていない場合でも、REFRESH MATERIALIZED VIEW コマンドを使用してマテリアライズドビューを明示的に更新できます。

  • Amazon Redshift では、外部テーブルで定義されているマテリアライズドビューは自動更新されません。

  • 更新ステータスについては、SVL_MV_REFRESH_STATUS をチェックできます。これは、ユーザーが開始したクエリまたは自動更新されたクエリを記録します。

  • 再計算専用のマテリアライズドビューで REFRESH を実行するには、スキーマに対する CREATE 権限があることを確認してください。詳細については、「GRANT」を参照してください。