Les vues matérialisées mettent en cache les résultats de requêtes précalculés, mais les modifications apportées aux tables sources peuvent les rendre obsolètes. L'actualisation planifiée maintient la synchronisation d'une vue matérialisée avec ses tables sources en exécutant des tâches d'actualisation automatiques à intervalle fixe ou selon une planification Cron.
Fonctionnement
Une actualisation planifiée est une tâche en arrière-plan que MaxCompute soumet selon la planification configurée. Le temps d'achèvement dépend des ressources du cluster et de la taille de la tâche.
Portée de l'actualisation
Vues matérialisées partitionnées : Si les données changent dans une partition de la table source partitionnée correspondant aux colonnes de clé de partition, seule la partition associée de la vue matérialisée est actualisée. Si les données d'autres tables associées à la vue matérialisée changent, une actualisation complète est lancée.
Vues matérialisées non partitionnées : MaxCompute vérifie si les données de la table source ont changé depuis la dernière actualisation. En l'absence de changement, l'actualisation est ignorée.
Gestion des chevauchements
Si une actualisation est toujours en cours lorsque l'heure planifiée suivante arrive, MaxCompute annule l'actualisation en attente et en déclenche une nouvelle à l'heure prévue suivante.
Exemple avec un intervalle de 20 minutes commençant à 10:00:00 :
|
Heure planifiée |
Résultat |
|
|
L'actualisation démarre et se termine à |
|
|
Annulée (l'actualisation précédente est toujours en cours) |
|
|
L'actualisation démarre comme prévu |
MaxCompute peut détecter les modifications de configuration de planification avec un délai pouvant aller jusqu'à 30 minutes. Une tâche d'actualisation planifiée peut être soumise avec ce délai après l'activation ou la modification de la planification.
Méthodes de planification
Trois méthodes contrôlent le moment de l'actualisation d'une vue matérialisée. Toutes trois nécessitent "enable_auto_refresh"="true" dans TBLPROPERTIES.
|
Méthode |
Syntaxe |
Unité d'intervalle |
Idéal pour |
|
Clause |
|
Minutes, heures ou jours |
Intervalles fixes avec une syntaxe lisible |
|
|
|
Minutes uniquement |
Contrôle à la minute près via les propriétés de la table |
|
|
|
Expression Quartz Cron |
Planifications horaires ou modèles Cron avancés |
Activer l'actualisation planifiée
Prérequis
Un projet MaxCompute disposant de ressources de calcul suffisantes
Une table source contenant des données
La table source suivante est utilisée dans tous les exemples :
CREATE TABLE mf_refresh (id BIGINT, name STRING);
INSERT INTO TABLE mf_refresh VALUES (1,'kyle'),(2,'tom');
Syntaxe complète
CREATE MATERIALIZED VIEW [IF NOT EXISTS] [project_name.]mv_name
[LIFECYCLE days]
[(col_name [COMMENT col_comment], ...)]
[DISABLE REWRITE]
[PARTITIONED BY (col_name [, col_name, ...])]
[CLUSTERED BY|RANGE CLUSTERED BY (col_name [, col_name, ...])
[SORTED BY (col_name [ASC | DESC] [, col_name [ASC | DESC] ...])]
INTO number_of_buckets BUCKETS]
[REFRESH EVERY N MINUTES/HOURS/DAYS]
TBLPROPERTIES("enable_auto_refresh"="true"[, "refresh_interval_minutes"="N"][, "refresh_cron"="expression"])
AS <select_statement>;
|
Paramètre |
Description |
|
|
Nombre de jours avant l'expiration de la vue matérialisée |
|
|
Désactive la réécriture automatique des requêtes basée sur la vue matérialisée |
|
|
Colonnes de clé de partition pour les vues matérialisées partitionnées |
|
|
Attributs de brassage et de tri. Nécessite |
|
|
Intervalle d'actualisation fixe |
|
|
Active l'actualisation planifiée. Obligatoire pour les trois méthodes |
|
|
Intervalle d'actualisation en minutes |
|
|
Expression Quartz Cron pour la planification horaire. L'expression utilise 6 ou 7 champs (secondes, minutes, heures, jour du mois, mois, jour de la semaine et année facultative). La cron Unix standard à 5 champs n'est pas prise en charge. Pour plus d'informations, consultez Exemples d'expressions Cron |
Méthode 1 : Clause EVERY (recommandée)
Spécifiez l'intervalle d'actualisation directement dans l'instruction CREATE MATERIALIZED VIEW. La prochaine actualisation s'exécute à l'heure de la précédente plus l'intervalle spécifié.
-
Créez une vue matérialisée qui s'actualise toutes les 10 minutes.
CREATE MATERIALIZED VIEW IF NOT EXISTS mf_mv_refresh REFRESH EVERY 10 MINUTES TBLPROPERTIES("enable_auto_refresh"="true") AS SELECT id, name FROM mf_refresh; -
Interrogez la vue matérialisée pour vérifier les données initiales. Résultat :
SELECT * FROM mf_mv_refresh;+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | +------------+------------+ -
Insérez de nouvelles lignes dans la table source.
INSERT INTO TABLE mf_refresh VALUES (3,'jen'),(4,'cathy'); -
Interrogez la vue matérialisée après 10 minutes. Les nouvelles lignes apparaissent une fois l'actualisation planifiée terminée. Résultat :
SELECT * FROM mf_mv_refresh;+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 3 | jen | | 4 | cathy | +------------+------------+
Méthode 2 : refresh_interval_minutes
Définissez l'intervalle d'actualisation en minutes via TBLPROPERTIES. La prochaine actualisation s'exécute à l'heure de la précédente plus le nombre de minutes spécifié.
-
Créez une vue matérialisée qui s'actualise toutes les 20 minutes.
CREATE MATERIALIZED VIEW IF NOT EXISTS mf_mv_refresh2 TBLPROPERTIES("enable_auto_refresh"="true", "refresh_interval_minutes"="20") AS SELECT id, name FROM mf_refresh; -
Interrogez la vue matérialisée pour vérifier les données initiales. Résultat :
SELECT * FROM mf_mv_refresh2;+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 3 | jen | | 4 | cathy | +------------+------------+ -
Insérez de nouvelles lignes dans la table source.
INSERT INTO TABLE mf_refresh VALUES (5,'roger'),(6,'david'); -
Interrogez la vue matérialisée après 20 minutes. Les nouvelles lignes apparaissent une fois l'actualisation planifiée terminée. Résultat :
SELECT * FROM mf_mv_refresh2;+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 3 | jen | | 4 | cathy | | 5 | roger | | 6 | david | +------------+------------+
Méthode 3 : refresh_cron
Utilisez une expression Quartz Cron pour définir des planifications basées sur des intervalles ou des horaires spécifiques. La valeur refresh_cron est une chaîne au format Quartz Cron.
Exemple : Actualisation toutes les 5 minutes
-
Créez une vue matérialisée qui s'actualise toutes les 5 minutes.
CREATE MATERIALIZED VIEW IF NOT EXISTS mf_mv_refresh3 TBLPROPERTIES("enable_auto_refresh"="true", "refresh_cron"="* */5 * * * ? *") AS SELECT id, name FROM mf_refresh; -
Interrogez la vue matérialisée pour vérifier les données initiales. Résultat :
SELECT * FROM mf_mv_refresh3;+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 3 | jen | | 4 | cathy | | 5 | roger | | 6 | david | +------------+------------+ -
Insérez de nouvelles lignes dans la table source.
INSERT INTO TABLE mf_refresh VALUES (7,'ethan'),(8,'cal'); -
Interrogez la vue matérialisée après 5 minutes. Les nouvelles lignes apparaissent une fois l'actualisation planifiée terminée. Résultat :
SELECT * FROM mf_mv_refresh3;+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 7 | ethan | | 8 | cal | | 3 | jen | | 4 | cathy | | 5 | roger | | 6 | david | +------------+------------+
Exemple : Actualisation quotidienne à 20 h 00
-
Créez une vue matérialisée qui s'actualise à 20 h 00 chaque jour.
CREATE MATERIALIZED VIEW IF NOT EXISTS mf_mv_refresh4 TBLPROPERTIES("enable_auto_refresh"="true", "refresh_cron"="0 0 20 * * ? *") AS SELECT id, name FROM mf_refresh; -
Interrogez la vue matérialisée pour vérifier les données initiales. Résultat :
SELECT * FROM mf_mv_refresh4;+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 7 | ethan | | 8 | cal | | 3 | jen | | 4 | cathy | | 5 | roger | | 6 | david | +------------+------------+ -
Insérez de nouvelles lignes dans la table source.
INSERT INTO TABLE mf_refresh VALUES (9,'annie'),(10,'zoe'); -
Interrogez la vue matérialisée après 20 h 00. Les nouvelles lignes apparaissent une fois l'actualisation planifiée terminée. Résultat :
SELECT * FROM mf_mv_refresh4;+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 9 | annie | | 10 | zoe | | 7 | ethan | | 8 | cal | | 3 | jen | | 4 | cathy | | 5 | roger | | 6 | david | +------------+------------+
Modifier la planification d'actualisation
Modifiez l'intervalle d'actualisation ou passez à une autre méthode de planification avec ALTER MATERIALIZED VIEW :
ALTER MATERIALIZED VIEW mf_mv_refresh2 SET TBLPROPERTIES("enable_auto_refresh"="true", "refresh_interval_minutes"="xx");
ALTER MATERIALIZED VIEW mf_mv_refresh3 SET TBLPROPERTIES("enable_auto_refresh"="true", "refresh_cron"="xx");
Désactiver l'actualisation planifiée
Définissez enable_auto_refresh sur false :
ALTER MATERIALIZED VIEW mf_mv_refresh SET TBLPROPERTIES("enable_auto_refresh"="false");
Afficher l'historique d'actualisation
Exécutez DESC EXTENDED pour afficher l'historique d'actualisation et les détails de configuration :
DESC EXTENDED mv;
Le résultat inclut la section AutoRefresh History avec l'ID d'instance, l'état, l'heure de début et l'heure de fin pour chaque exécution d'actualisation :
+------------------------------------------------------------------------------------+
| Owner: ALIYUN$$****@***.aliyunid.com |
| Project: m**** |
| TableComment: |
+------------------------------------------------------------------------------------+
| CreateTime: 2023-05-30 13:16:07 |
| LastDDLTime: 2023-05-30 13:16:07 |
| LastModifiedTime: 2023-05-30 13:16:07 |
+------------------------------------------------------------------------------------+
| MaterializedView: YES |
| ViewText: select id,name from mf_refresh |
| Rewrite Enabled: true |
| AutoRefresh Enabled: true |
| Refresh Interval Minutes: 10 |
+------------------------------------------------------------------------------------+
| Native Columns: |
+------------------------------------------------------------------------------------+
| Field | Type | Label | ExtendedLabel | Nullable | DefaultValue | Comment |
+------------------------------------------------------------------------------------+
| id | bigint | | | true | NULL | |
| name | string | | | true | NULL | |
+------------------------------------------------------------------------------------+
| Extended Info: |
+------------------------------------------------------------------------------------+
| IsOutdated: false |
| TableID: 569ec712873e44b3868e79b7a8beabab |
| IsArchived: false |
| PhysicalSize: 1875 |
| FileNum: 2 |
| StoredAs: CFile |
| CompressionStrategy: normal |
| odps.timemachine.retention.days: 1 |
| ColdStorageStatus: N/A |
| encryption_enable: false |
+------------------------------------------------------------------------------------+
| AutoRefresh History: |
+------------------------------------------------------------------------------------+
| InstanceId | Status | StartTime | EndTime |
+------------------------------------------------------------------------------------+
| 20230619070546735ghwl1****** | TERMINATED | 2023-06-19 15:05:46 | 2023-06-19 15:05:47 |
| 20230619065545586gwllc****** | TERMINATED | 2023-06-19 14:55:45 | 2023-06-19 14:55:46 |
| 20230619064544463gcjgom****** | TERMINATED | 2023-06-19 14:45:44 | 2023-06-19 14:45:45 |
| 20230619063543334gzxs2d****** | TERMINATED | 2023-06-19 14:35:43 | 2023-06-19 14:35:44 |
| 2023061906254257gi21w2****** | TERMINATED | 2023-06-19 14:25:42 | 2023-06-19 14:25:43 |
| 20230619061540813giacg8****** | TERMINATED | 2023-06-19 14:15:41 | 2023-06-19 14:15:41 |
| 20230619060539674gswjq9****** | TERMINATED | 2023-06-19 14:05:39 | 2023-06-19 14:05:40 |
| 20230619055538578gvdjk****** | TERMINATED | 2023-06-19 13:55:38 | 2023-06-19 13:55:40 |
| 20230619054537356glqdne****** | TERMINATED | 2023-06-19 13:45:37 | 2023-06-19 13:45:38 |
| 2023061905353687gcc5pl****** | TERMINATED | 2023-06-19 13:35:36 | 2023-06-19 13:35:37 |
+------------------------------------------------------------------------------------+
Dans MaxCompute, TERMINATED signifie que l'exécution de la tâche est terminée. Cet état couvre à la fois les exécutions réussies et échouées. Pour plus de détails sur les métadonnées des vues matérialisées, consultez Afficher les informations sur une vue matérialisée.