Vues matérialisées : l’échec de l’actualisation invalide une vue matérialisée

Attention

Ce changement de comportement est présent dans le bundle 2023_05.

Pour connaître le statut actuel du bundle, reportez-vous à Historique du bundle.

Les vues matérialisées sont mises à jour automatiquement et régulièrement par un processus d’arrière-plan.

Actuellement, si l’actualisation d’une vue matérialisée échoue, les données de la vue matérialisée ne sont pas mises à jour et le processus d’arrière-plan continue d’essayer d’actualiser la vue matérialisée périodiquement.

Si l’échec est dû à un problème qui continuera à se produire (par exemple, une erreur de division par zéro causée par la définition de la vue matérialisée ou par les données), le processus d’arrière-plan échouera continuellement à actualiser la vue matérialisée et les données de la vue matérialisée ne seront pas mises à jour.

Dans la version actuelle, certains types d’erreurs au cours du processus d’actualisation invalident la vue matérialisée. Par ailleurs :

  • Lorsque vous interrogez la vue matérialisée, le résultat comprendra la raison de l’invalidation.

  • La sortie de la commande SHOW MATERIALIZED VIEWS comprendra la raison pour laquelle la vue matérialisée a été invalidée.

À l’aide des informations fournies par la sortie de ces commandes, résolvez le problème de la vue matérialisée et exécutez la commande ALTER MATERIALIZED VIEW… RESUME pour reprendre la vue matérialisée.

En résumé, le processus d’actualisation et d’interrogation de la vue matérialisée a été modifié comme décrit ci-dessous :

Précédemment

Le processus d’arrière-plan ne parvient pas à actualiser la vue matérialisée.

Bien que les données de la vue matérialisée soient obsolètes, la sortie de l’interrogation de la vue matérialisée n’indique pas que les données le sont.

Lorsque vous exécutez la commande SHOW MATERIALIZED VIEWS, la colonne refreshed_on indique que les données sont obsolètes, mais la sortie n’en donne pas la raison.

Actuellement

Le processus d’arrière-plan invalide la vue matérialisée.

L’interrogation de la vue matérialisée aboutit à une erreur qui indique pourquoi le processus d’actualisation n’a pas réussi à mettre à jour la vue matérialisée. Par exemple :

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

Lorsque vous exécutez la commande SHOW MATERIALIZED VIEWS, la colonne invalid indique que la vue matérialisée est non valide et la colonne invalid_reason contient la raison de l’invalidation. Par exemple :

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

Par exemple, supposons que vous exécutiez les instructions suivantes pour créer une vue matérialisée :

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

Supposons que vous insériez des données dans la table, ce qui entraînerait l’échec de l’actualisation de la vue matérialisée. Par exemple, supposons que vous exécutiez l’instruction suivante :

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

Lors de l’actualisation suivante de la vue matérialisée, l’actualisation échouera avec une erreur de type « division par zéro ». Comme l’actualisation échoue, la vue matérialisée sera invalidée.

Pour voir la raison de l’invalidation, interrogez la vue matérialisée ou exécutez la commande 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 | ...
...  +---------+------------------+ ...

Réglez le problème à l’origine de l’invalidation et exécutez la commande ALTER MATERIALIZED VIEW… RESUME pour reprendre la vue matérialisée :

ALTER MATERIALIZED VIEW my_mv RESUME;
Copy

Réf : 1178