マテリアライズドビュー: リフレッシュの失敗によるマテリアライズドビューの無効化

注意

この動作変更は2023_05バンドルにあります。

バンドルの現在のステータスについては、 バンドル履歴 をご参照ください。

マテリアライズドビューは、バックグラウンドプロセスによって定期的に自動で更新されます。

現在、マテリアライズドビューのリフレッシュに失敗した場合、マテリアライズドビューのデータはリフレッシュされず、バックグラウンドプロセスはマテリアライズドビューのリフレッシュを定期的に試み続けます。

障害が発生し続ける問題に起因する場合(例: マテリアライズドビュー定義またはデータに起因するゼロ除算エラー)、バックグラウンドプロセスはマテリアライズドビューのリフレッシュに継続的に失敗し、マテリアライズドビューのデータはリフレッシュされません。

現在のリリースでは、リフレッシュ処理中に特定の種類のエラーが発生すると、マテリアライズドビューが無効になります。さらに、

  • マテリアライズドビューをクエリすると、無効の理由が出力されます。

  • SHOW MATERIALIZED VIEWS コマンドの出力には、マテリアライズドビューが無効になった理由が含まれます。

こうしたコマンドの出力の情報を使用して、マテリアライズドビューの問題に対処し、 ALTER MATERIALIZED VIEW ... RESUME コマンドを実行してマテリアライズドビューを再開します。

要約すると、マテリアライズドビューのリフレッシュとクエリのプロセスは以下のように変更されました。

以前

バックグラウンドプロセスは、マテリアライズドビューのリフレッシュに失敗しました。

マテリアライズドビューのデータは古くなっていますが、マテリアライズドビューへのクエリの出力は、データが古くなっていることを示しません。

SHOW MATERIALIZED VIEWS コマンドを実行すると、refreshed_on列にデータが古いことが表示されますが、その理由は出力されません。

現在

バックグラウンドプロセスは、マテリアライズドビューを無効にします。

マテリアライズドビューをクエリすると、リフレッシュ処理でマテリアライズドビューのリフレッシュに失敗した理由を示すエラーが表示されます。例:

SELECT * FROM my_mv;
Copy
002037 (42601): SQL compilation error:
  Failure during expansion of view 'MY_MV':
    SQL compilation error: Materialized View MY_MV is invalid.
    Invalidation reason: Division by zero

SHOW MATERIALIZED VIEWS コマンドを実行すると、 invalid 列にマテリアライズドビューが無効であることが示され、 invalid_reason 列に無効の理由が含まれます。例:

SHOW MATERIALIZED VIEWS;
Copy
...  +---------+------------------+ ...
...  | invalid | invalid_reason   | ...
...  +---------+------------------+ ...
...  | true    | Division by zero | ...
...  +---------+------------------+ ...

たとえば、次のコマンドを実行してマテリアライズドビューを作成するとします。

CREATE OR REPLACE TABLE my_base_table (a INT, b INT, c VARCHAR(16));
Copy
INSERT INTO my_base_table VALUES (1, 1, 'valid data');
Copy
CREATE OR REPLACE MATERIALIZED VIEW my_mv AS SELECT a / b AS div FROM my_base_table;
Copy

マテリアライズドビューのリフレッシュに失敗するようなデータをテーブルに挿入するとします。たとえば、次のステートメントを実行するとします。

INSERT INTO my_base_table VALUES (1, 0, 'invalid data');
Copy

次にマテリアライズドビューをリフレッシュすると、「ゼロ除算」エラーでリフレッシュに失敗します。リフレッシュに失敗するため、マテリアライズドビューは無効になります。

無効の理由を表示するには、マテリアライズドビューをクエリするか、 SHOW MATERIALIZED VIEWS コマンドを実行します。

SELECT * FROM my_mv;
Copy
002037 (42601): SQL compilation error:
  Failure during expansion of view 'MY_MV':
    SQL compilation error: Materialized View MY_MV is invalid.
    Invalidation reason: Division by zero
SHOW MATERIALIZED VIEWS;
Copy
...  +---------+------------------+ ...
...  | invalid | invalid_reason   | ...
...  +---------+------------------+ ...
...  | true    | Division by zero | ...
...  +---------+------------------+ ...

無効化の原因となった問題に対処し、 ALTER MATERIALIZED VIEW ... RESUME コマンドを実行してマテリアライズドビューを再開します。

ALTER MATERIALIZED VIEW my_mv RESUME;
Copy

参照: 1178