Tous les produits
Search
Centre de documentation

AnalyticDB:Actualiser les vues matérialisées

Dernière mise à jour :Aug 10, 2026

Les vues matérialisées sont souvent utilisées pour accélérer les requêtes complexes ou simplifier les processus ETL. Elles fonctionnent en précalculant une requête définie par l'utilisateur et en stockant les résultats. Vous pouvez définir une politique d'actualisation pour une vue matérialisée en fonction des modèles d'écriture de ses tables de base, de la complexité computationnelle de sa requête (query_body) et de vos exigences en matière de fraîcheur des données.

Choisir une politique d'actualisation

Les vues matérialisées prennent en charge deux politiques d'actualisation : l'actualisation complète (COMPLETE) et l'actualisation incrémentielle (FAST).

  • Une actualisation complète exécute le code SQL de la requête d'origine pour analyser les données de toutes les partitions cibles dans la table de base et remplace entièrement les anciennes données par les données nouvellement calculées.

  • Effectue une actualisation incrémentielle. Le système réécrit la requête de la vue (query_body) pour analyser uniquement les données modifiées (issues des opérations INSERT, DELETE et UPDATE) dans la table de base et applique ces modifications à la vue matérialisée. Cela évite d'analyser l'intégralité de la table de base à chaque cycle et réduit le coût de calcul de chaque actualisation.

Le tableau suivant compare les cas d'utilisation, les avantages et les limites des deux politiques d'actualisation.

Politique d'actualisation

Cas d'utilisation

Caractéristiques

Actualisation complète

Scénarios hors ligne :

  • Mises à jour par lots quotidiennes (J+1)

  • Mises à jour horaires des données

  • Petits ensembles de données avec une faible complexité de calcul où une latence de l'ordre de la minute est acceptable.

Avantage : query_body prend en charge n'importe quelle requête SQL.

Limite : ne peut effectuer que des mises à jour par lots complètes.

Actualisation incrémentielle

Scénarios en temps réel :

  • Ingestion de données en temps réel.

  • Rapports ou pipelines ETL nécessitant des mises à jour en temps réel.

  • Cas d'utilisation exigeant une fraîcheur des données de l'ordre de la seconde.

Avantages :

  • Traite généralement des volumes de données plus faibles, ce qui entraîne une surcharge réduite.

  • Peut remplacer le traitement de flux, ce qui réduit les coûts de développement et de maintenance.

Limites :

  • Soumis aux limites concernant la version du moteur, les tables de base et query_body.

  • L'actualisation manuelle et l'actualisation déclenchée par écrasement ne sont pas prises en charge.

Choisir un déclencheur d'actualisation

Lorsque vous créez une vue matérialisée, vous définissez à la fois sa politique d'actualisation et son déclencheur d'actualisation. Les vues matérialisées prennent en charge l'actualisation à la demande (ON DEMAND) et l'actualisation déclenchée par écrasement (ON OVERWRITE). L'actualisation à la demande peut être subdivisée en actualisation planifiée et actualisation manuelle. Si vous ne spécifiez pas de déclencheur d'actualisation, l'actualisation à la demande est appliquée par défaut.

Lors du choix d'un déclencheur d'actualisation, tenez compte de vos exigences en matière de fraîcheur des données et de la charge du cluster. Les caractéristiques et les cas d'utilisation pour chaque déclencheur sont les suivants :

  • Actualisation manuelle : la vue matérialisée n'actualise pas automatiquement les données. Vous devez exécuter REFRESH MATERIALIZED VIEW pour actualiser manuellement les données. Cette méthode convient aux scénarios où la cohérence des données n'est pas une priorité élevée ou lorsque les données changent rarement.

  • Actualisation planifiée : la vue matérialisée s'actualise automatiquement à une heure spécifiée. Si une actualisation est toujours en cours d'exécution au moment où la suivante est programmée pour démarrer, le système ignore la nouvelle actualisation et attend l'intervalle suivant. Cette approche est adaptée aux scénarios où les données de la table de base changent périodiquement, comme les nouveaux enregistrements de transactions générés lors de périodes fixes quotidiennes ou hebdomadaires.

  • Actualisation déclenchée par écrasement : la vue matérialisée s'actualise automatiquement lorsqu'une table de base est écrasée à l'aide de INSERT OVERWRITE. Ce mode est approprié pour les scénarios ayant des exigences élevées en matière de données en temps réel et de cohérence.

Différentes politiques d'actualisation prennent en charge différents déclencheurs d'actualisation, comme indiqué dans le tableau suivant :

Politique d'actualisation

Actualisation à la demande (ON DEMAND)

Actualisation déclenchée par écrasement (ON OVERWRITE)

Actualisation manuelle

Actualisation planifiée

Actualisation complète

✔️

✔️

✔️

Actualisation incrémentielle

❌

✔️

❌

Définir les politiques et déclencheurs d'actualisation

Les exemples suivants utilisent les tables customer, sales et product pour montrer comment définir la politique d'actualisation et le déclencheur d'actualisation pour une nouvelle vue matérialisée.

/*+ RC_DDL_ENGINE_REWRITE_XUANWUV2=false */ -- Set the table engine to XUANWU.
CREATE TABLE customer (
    customer_id INT PRIMARY KEY,
    customer_name VARCHAR(255),
    is_vip Boolean
);

/*+ RC_DDL_ENGINE_REWRITE_XUANWUV2=false */ -- Set the table engine to XUANWU.
CREATE TABLE sales (
    sale_id INT PRIMARY KEY,
    product_id INT,
    customer_id INT,
    price DECIMAL(10, 2),
    quantity INT,
    sale_date TIMESTAMP
);
/*+ RC_DDL_ENGINE_REWRITE_XUANWUV2=false */ -- Set the table engine to XUANWU.
CREATE TABLE product (
    product_id INT PRIMARY KEY,
    product_name VARCHAR,
    category_id INT,
    unit_price DECIMAL(10, 2),
    stock_quantity INT
);

Créer une vue matérialisée avec actualisation complète

Lors de la création d'une vue matérialisée, utilisez le mot-clé REFRESH COMPLETE pour spécifier une politique d'actualisation complète.

Une vue matérialisée utilisant l'actualisation complète prend en charge l'actualisation manuelle, l'actualisation planifiée et l'actualisation déclenchée par écrasement.

  • Créez une vue matérialisée avec actualisation complète nommée compl_mv1. Comme cette vue ne définit ni déclencheur d'actualisation ni paramètre NEXT, elle utilise par défaut une actualisation à la demande qui doit être déclenchée manuellement.

    CREATE MATERIALIZED VIEW compl_mv1
    REFRESH COMPLETE
    AS
    SELECT * FROM customer;
  • Créez une vue matérialisée avec actualisation complète nommée compl_mv2. Cette vue définit une actualisation à la demande (ON DEMAND) et spécifie les heures d'actualisation initiale (START WITH) et suivantes (NEXT). Dans cet exemple, la vue s'actualise automatiquement tous les jours à 2 h 00.

    CREATE MATERIALIZED VIEW compl_mv2
    REFRESH COMPLETE ON DEMAND
     START WITH DATE_FORMAT(now() + interval 1 day, '%Y-%m-%d 02:00:00')
     NEXT DATE_FORMAT(now() + interval 1 day, '%Y-%m-%d 02:00:00')
    AS
    SELECT * FROM customer;
  • Créez une vue matérialisée avec actualisation complète nommée compl_mv3. Cette vue est configurée pour une actualisation déclenchée par écrasement (ON OVERWRITE). Ce mode ne nécessite pas de clause NEXT.

    CREATE MATERIALIZED VIEW compl_mv3
    REFRESH COMPLETE ON OVERWRITE
    AS
    SELECT * FROM customer;

Créer une vue matérialisée avec actualisation incrémentielle

Lors de la création d'une vue matérialisée, utilisez le mot-clé REFRESH FAST pour spécifier une politique d'actualisation incrémentielle. Une vue matérialisée utilisant l'actualisation incrémentielle ne prend en charge que l'actualisation planifiée.

Activer la journalisation binaire

Avant de créer une vue matérialisée utilisant l'actualisation incrémentielle, vous devez activer la journalisation binaire pour le cluster et ses tables de base.

SET ADB_CONFIG BINLOG_ENABLE=true; -- For clusters with an engine version before 3.2.0.0, run this command to enable binary logging. It is enabled by default in 3.2.0.0 and later.
ALTER TABLE customer binlog=true;
ALTER TABLE sales binlog=true;
ALTER TABLE product binlog=true;
Important
  • INSERT OVERWRITE INTO et les opérations TRUNCATE sont prises en charge sur les tables avec journalisation binaire activée uniquement dans la version 3.2.0.0 du moteur et versions ultérieures.

  • Après avoir créé une vue matérialisée avec actualisation incrémentielle, vous ne pouvez pas désactiver la journalisation binaire sur les tables de base.

  • Après avoir supprimé une vue matérialisée utilisant l'actualisation incrémentielle, vous pouvez désactiver manuellement la journalisation binaire pour le cluster et les tables de base en exécutant SET ADB_CONFIG BINLOG_ENABLE=false; et ALTER TABLE <table_name> binlog=false;.

Vues matérialisées à table unique

  • Créez une vue matérialisée à table unique fast_mv1 qui utilise l'actualisation incrémentielle sans opération d'agrégation et s'actualise toutes les 10 secondes.

    CREATE MATERIALIZED VIEW fast_mv1
    REFRESH FAST NEXT now() + INTERVAL 10 second
    AS
    SELECT sale_id, sale_date, price
    FROM sales
    WHERE price > 10;
  • Créez une vue matérialisée à table unique fast_mv2 qui utilise l'actualisation incrémentielle avec une agrégation GROUP BY et s'actualise toutes les 5 secondes.

    CREATE MATERIALIZED VIEW fast_mv2
    REFRESH FAST NEXT now() + INTERVAL 5 second
    AS
    SELECT
       customer_id, sale_date,                 -- The system uses the GROUP BY columns as the primary key of the materialized view.
       COUNT(sale_id) AS cnt_sale_id,          -- Aggregate output column.
       SUM(price * quantity) AS total_revenue, -- Aggregate output column.
       customer_id / 100 AS new_customer_id    -- Non-aggregate output columns can use any expression.
    FROM sales
    WHERE ifnull(price, 1) > 0                 -- Conditions can use any expression.
    GROUP BY customer_id, sale_date;
  • Créez une vue matérialisée à table unique fast_mv3 qui utilise l'actualisation incrémentielle sans agrégation GROUP BY et s'actualise toutes les minutes.

    CREATE MATERIALIZED VIEW fast_mv3
    REFRESH FAST NEXT now() + INTERVAL 1 minute
    AS
    SELECT count(*) AS cnt   -- The system generates a constant primary key to ensure that the materialized view contains only one record.
    FROM sales;

Vues matérialisées multi-tables

  • Créez une vue matérialisée multi-tables fast_mv4 qui utilise l'actualisation incrémentielle sans opération d'agrégation et s'actualise toutes les 5 secondes.

    CREATE MATERIALIZED VIEW fast_mv4
    REFRESH FAST NEXT now() + INTERVAL 5 second
    AS
    SELECT 
        c.customer_id,
        c.customer_name,
        p.product_id,
        s.sale_id,
        (s.price * s.quantity) AS revenue
    FROM 
        sales s
    JOIN 
        customer c ON s.customer_id = c.customer_id
    JOIN 
        product p ON s.product_id = p.product_id;
  • Créez une vue matérialisée multi-tables fast_mv5 qui utilise l'actualisation incrémentielle avec une agrégation GROUP BY et s'actualise toutes les 10 secondes.

    CREATE MATERIALIZED VIEW fast_mv5
    REFRESH FAST NEXT now() + INTERVAL 10 second
    AS
    SELECT 
        s.sale_id,
        c.customer_name,
        p.product_name,
        COUNT(*) AS cnt,           
        SUM(s.price * s.quantity) AS revenue,         
        SUM(p.unit_price) AS sum_p          
    FROM 
        sales s
    JOIN 
        (SELECT customer_id, customer_name FROM customer) c ON c.customer_id = s.customer_id
    JOIN 
        (SELECT * FROM product WHERE stock_quantity > 0) p ON p.product_id = s.product_id
    GROUP BY 
        s.sale_id, c.customer_name, p.product_name;

Remarque

Si une table de base subit une opération TRUNCATE ou INSERT OVERWRITE, ou si une anomalie interne susceptible d'affecter l'exactitude des données se produit, une vue matérialisée incrémentielle revient automatiquement à une actualisation complète ponctuelle. Une fois l'actualisation complète réussie, les actualisations suivantes reprennent automatiquement en mode incrémentiel.

Limites

Les limites suivantes s'appliquent aux vues matérialisées utilisant l'actualisation incrémentielle :

  • Pour les clusters dont la version du moteur est antérieure à 3.2.3.0, une table partitionnée ne peut pas servir de table de base pour une vue matérialisée utilisant l'actualisation incrémentielle.

  • Pour les clusters dont la version du moteur est antérieure à 3.2.3.1, les opérations INSERT OVERWRITE et TRUNCATE ne sont pas prises en charge sur les tables de base d'une vue matérialisée utilisant l'actualisation incrémentielle. L'exécution de ces opérations génère une erreur.

  • L'actualisation incrémentielle prend uniquement en charge les actualisations planifiées avec un intervalle compris entre 5 secondes (s) et 5 minutes (min).

  • Le corps de la requête (query_body) d'une vue matérialisée utilisant l'actualisation incrémentielle présente les limitations suivantes :

    • Une vue matérialisée doit garantir que ses résultats sont identiques à ceux d'une requête directe sur ses tables de base et doit prendre en charge toutes les modifications DML. Si query_body ne prend pas en charge l'actualisation incrémentielle, l'instruction CREATE MATERIALIZED VIEW renvoie une erreur.

    • Les conditions ne peuvent pas contenir d'expressions non déterministes, telles que now() ou rand().

    • Seules les fonctions d'agrégation suivantes sont prises en charge : COUNT, SUM, MAX, MIN, AVG, APPROX_DISTINCT et COUNT(DISTINCT).

    • Lorsque query_body utilise la fonction d'agrégation MAX, MIN, APPROX_DISTINCT ou COUNT(DISTINCT), seules les opérations INSERT sont autorisées sur les tables de base. Les opérations de suppression de données, telles que DELETE, UPDATE, REPLACE et INSERT ON DUPLICATE KEY UPDATE, sont interdites.

    • Le mot-clé DISTINCT n'est pas pris en charge pour les fonctions d'agrégation autres que COUNT(DISTINCT).

    • COUNT(DISTINCT) prend uniquement en charge le type INTEGER.

    • AVG ne prend pas en charge le type DECIMAL.

    • Le mot-clé HAVING n'est pas pris en charge pour les opérations d'agrégation.

    • Les fonctions de fenêtrage ne sont pas prises en charge.

    • Les opérations de tri ne sont pas prises en charge.

    • Les opérations ensemblistes telles que UNION, EXCEPT et INTERSECT ne sont pas prises en charge.

  • Les vues matérialisées multi-tables utilisant l'actualisation incrémentielle présentent les limitations supplémentaires suivantes :

    • Les vues matérialisées multi-tables ne prennent actuellement en charge que INNER JOIN.

    • Par défaut, une vue matérialisée multi-tables peut être jointe à un maximum de cinq tables.

    • Les colonnes de jointure dans une vue matérialisée multi-tables doivent être des colonnes d'origine des tables, avoir le même type de données et chaque colonne de jointure doit posséder un index.

Actualiser manuellement les vues matérialisées

Si une vue matérialisée est créée avec la politique d'actualisation ON DEMAND et qu'aucune clause NEXT n'est définie, elle ne s'actualise pas automatiquement. Vous devez actualiser manuellement la vue matérialisée.

REFRESH MATERIALIZED VIEW <mv_name>;

Après avoir soumis une demande d'actualisation, le système ajoute la tâche d'actualisation à une file d'attente en arrière-plan. Vous pouvez continuer à effectuer d'autres opérations sans attendre la fin de l'actualisation.

Un message de retour indiquant Query OK ou Success signifie que la tâche d'actualisation a été soumise avec succès à la file d'attente.

Interroger les historiques d'actualisation

Interroger les historiques d'actualisation automatique

Exécutez l'instruction SQL suivante pour interroger les historiques d'actualisation automatique d'une vue matérialisée spécifique, y compris l'heure de début (start_time), l'heure de fin (end_time), l'état (state) et l'ID de processus (process_id). Pour plus d'informations sur les champs des résultats renvoyés, consultez Gérer les vues matérialisées.

SELECT * FROM information_schema.mv_auto_refresh_jobs where mv_name = '<mv_name>';

Interroger les historiques d'actualisation manuelle

  • Pour interroger les historiques d'actualisation manuelle des 30 derniers jours, vous pouvez utiliser la fonctionnalité d'audit SQL. Lors de la requête, saisissez le mot-clé REFRESH MATERIALIZED VIEW nom_vue pour trouver des informations telles que l'heure, la durée, l'adresse IP et le compte de base de données pour chaque actualisation manuelle.

    La fonctionnalité d'audit SQL doit être activée séparément. Les opérations SQL survenues avant son activation ne sont pas enregistrées dans les journaux d'audit.
  • Pour interroger les historiques d'actualisation manuelle et automatique des 14 derniers jours, vous pouvez utiliser la fonctionnalité de diagnostic et d'optimisation SQL. Lors de la requête, saisissez le nom de la vue matérialisée, par exemple compl_mv1, pour trouver des informations pour toutes les requêtes SQL associées (y compris la création, l'actualisation manuelle, l'actualisation automatique et la modification), telles que l'heure de début, le compte de base de données, la durée et l'ID de processus.

Arrêter une tâche d'actualisation en cours d'exécution

Si une tâche d'actualisation prend trop de temps, vous pouvez l'arrêter manuellement en utilisant son ID de processus. Si cela échoue, contactez le support technique.

Remarques

Si vous arrêtez une tâche d'actualisation en utilisant KILL PROCESS <id_processus>;, notez que la prochaine actualisation se déclenchera toujours à l'heure planifiée suivante ou lors du prochain écrasement de la table de base.

Documentation connexe