Tous les produits
Search
Centre de documentation

AnalyticDB:Create a materialized view

Dernière mise à jour :Aug 10, 2026

Les vues matérialisées précalculent et stockent les résultats des requêtes, ce qui permet à AnalyticDB for MySQL de servir directement ces résultats sans réexécuter des jointures multi-tables et des agrégations coûteuses à chaque interrogation. Cette rubrique explique comment créer une vue matérialisée, choisir un type d'actualisation et résoudre les erreurs courantes.

Prérequis

Avant de commencer, assurez-vous que :

  • La version du noyau du cluster est 3.1.3.4 ou ultérieure. Pour vérifier ou mettre à jour la version, accédez à la section Configuration Information de la page Cluster Information dans la console AnalyticDB for MySQL.

  • Votre compte de base de données dispose de toutes les autorisations requises :

    • Autorisation CREATE sur les tables de la base de données cible

    • Autorisation SELECT sur toutes les colonnes (ou des colonnes spécifiques) de chaque table de base référencée par la vue matérialisée

    • Pour les vues matérialisées actualisées automatiquement, vous devez également disposer des éléments suivants :

      • Autorisation de connexion depuis '%' (n'importe quelle adresse IP)

      • Autorisation INSERT sur la vue matérialisée ou sur toutes les tables de sa base de données

Choisir un type d'actualisation

AnalyticDB for MySQL prend en charge deux types d'actualisation. Le type d'actualisation détermine les fonctionnalités SQL utilisables dans le corps de la requête et la manière dont la vue matérialisée reste synchronisée avec ses tables de base.

Actualisation complète

Actualisation rapide (incrémentielle)

Fonctionnement

Remplace toutes les données de la vue matérialisée

Applique uniquement les modifications intervenues depuis la dernière actualisation

Tables de base

Tables internes, tables externes, vues matérialisées existantes et vues

Tables internes uniquement

Prise en charge SQL

Syntaxe SELECT complète

Sous-ensemble de SELECT (voir Contraintes des requêtes pour les vues matérialisées incrémentielles)

Déclencheurs d'actualisation

Actualisation automatique planifiée, actualisation automatique lors de l'écrasement d'une table de base ou actualisation manuelle

Actualisation automatique planifiée uniquement (intervalle : de 5 secondes à 5 minutes)

Version minimale

3.1.3.4

3.1.9.0 (table unique) ; 3.2.1.0 (multi-tables)

Préparer les tables de base

Les exemples de cette rubrique utilisent les deux tables suivantes. Créez-les avant d'exécuter les exemples de vues matérialisées.

/*+ 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
);
Les exemples ne spécifient aucun groupe de ressources. En l'absence de groupe de ressources, AnalyticDB for MySQL utilise les ressources de calcul réservées du groupe de ressources interactif par défaut pour créer et actualiser les vues matérialisées. Pour utiliser plutôt un groupe de ressources de tâches, consultez Utiliser des ressources élastiques.

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

Les vues matérialisées à actualisation complète prennent en charge la syntaxe SELECT complète et peuvent référencer des tables internes, des tables externes, des vues matérialisées existantes et des vues.

L'exemple suivant crée une vue matérialisée nommée join_mv qui joint les tables customer et sales et est configurée pour une actualisation manuelle :

CREATE MATERIALIZED VIEW join_mv
REFRESH COMPLETE ON DEMAND
AS
SELECT
  sale_id,
  SUM(price * quantity) AS price
FROM customer
INNER JOIN (SELECT sale_id, customer_id, price, quantity FROM sales) sales
  ON customer.customer_id = sales.customer_id
GROUP BY customer.customer_id;

Pour actualiser la vue manuellement, exécutez la commande suivante :

REFRESH MATERIALIZED VIEW join_mv;

Créer une vue matérialisée rapide (incrémentielle)

Les vues matérialisées rapides appliquent uniquement les modifications intervenues depuis la dernière actualisation, ce qui s'avère plus efficace pour les grands ensembles de données évoluant de manière incrémentielle. La contrepartie est un éventail plus restreint de fonctionnalités SQL prises en charge : ce que vous écrivez dans le corps de la requête SELECT détermine si l'actualisation incrémentielle s'applique (voir Contraintes des requêtes pour les vues matérialisées incrémentielles).

Version requise : 3.1.9.0 ou ultérieure (table unique), 3.2.1.0 ou ultérieure (multi-tables).

Activer la journalisation binaire

L'actualisation incrémentielle repose sur la journalisation binaire pour suivre les modifications apportées aux tables de base. Activez-la au niveau du cluster et pour chaque table de base :

SET ADB_CONFIG BINLOG_ENABLE=true;
ALTER TABLE customer binlog=true;
ALTER TABLE sales binlog=true;

Si l'activation de la journalisation binaire échoue, consultez Impossible de créer une vue matérialisée FAST.

Créer une vue matérialisée rapide sur une seule table

L'exemple suivant crée une vue matérialisée rapide nommée sales_mv_incre sur la table sales avec un intervalle d'actualisation automatique de 3 minutes :

CREATE MATERIALIZED VIEW sales_mv_incre
REFRESH FAST NEXT now() + INTERVAL 3 minute
AS
SELECT
  sale_id,
  SUM(price * quantity) AS price
FROM sales
GROUP BY sale_id;

Créer une vue matérialisée rapide multi-tables

Sur les clusters exécutant la version V3.2.1.0 ou ultérieure, les vues matérialisées rapides peuvent joindre plusieurs tables. L'exemple suivant joint les tables customer et sales :

CREATE MATERIALIZED VIEW join_mv_incre
REFRESH FAST NEXT now() + INTERVAL 3 minute
AS
SELECT
  customer.customer_id,
  SUM(sales.price) AS price
FROM customer
INNER JOIN (SELECT customer_id, price FROM sales) sales
  ON customer.customer_id = sales.customer_id
GROUP BY customer.customer_id;

Remarque

Si une table de base fait l'objet d'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 unique. Une fois l'actualisation complète réussie, les actualisations suivantes reprennent automatiquement en mode incrémentiel.

Pour connaître la syntaxe complète de CREATE MATERIALIZED VIEW, consultez CREATE MATERIALIZED VIEW.

Surveiller la progression de la création

Une instruction CREATE MATERIALIZED VIEW peut prendre du temps, car elle inclut un chargement initial des données. Exécutez la requête suivante pour répertorier les vues matérialisées en cours de création :

SHOW PROCESSLIST WHERE info LIKE '%CREATE MATERIALIZED VIEW%';

Chaque ligne représente une vue matérialisée en cours de création. Le champ User affiche le compte de base de données, State indique l'état actuel et Info contient l'instruction CREATE complète. Pour les définitions des champs, consultez SHOW PROCESSLIST.

Afficher des exemples de résultats

Exemple de sortie :

+-------+-------------------+-------+--------------------+-------+-------------------+----+---------+-------------------------------+
|Id     |ProcessId          |User   |Host                |DB     |Command            |Time|State    |Info                           |
+-------+-------------------+-------+--------------------+-------+-------------------+----+---------+-------------------------------+
|31801  |20250127144727...  |wenjun |21.17.xx.xx:49534   |demo1  |INSERT_FROM_SELECT |2   |RUNNING  |CREATE MATERIALIZED VIEW join_mv|
|       |                   |       |                    |       |                   |    |         |REFRESH COMPLETE ON DEMAND     |
|       |                   |       |                    |       |                   |    |         |AS ...                         |
+-------+-------------------+-------+--------------------+-------+-------------------+----+---------+-------------------------------+

Lorsque SHOW PROCESSLIST ne renvoie aucune ligne, la vue matérialisée a été créée, y compris son schéma et ses données initiales.

Utiliser des ressources élastiques pour créer ou actualiser des vues matérialisées

Par défaut, AnalyticDB for MySQL utilise les ressources de calcul réservées du groupe de ressources interactif par défaut (user_default) pour créer et actualiser les vues matérialisées. Pour éviter toute concurrence avec les charges de travail interactives, utilisez plutôt un groupe de ressources de tâches.

Quand utiliser des ressources élastiques :

  • Vous souhaitez isoler la création et l'actualisation des vues matérialisées des requêtes interactives.

  • Vous souhaitez éviter d'acheter des ressources dédiées à l'avance.

Contrepartie : Les groupes de ressources de tâches provisionnent les ressources de calcul à la demande, ce qui ajoute une surcharge de démarrage de quelques secondes à quelques minutes avant chaque actualisation, par rapport aux groupes de ressources interactifs.

Prérequis pour le cluster :

  • Enterprise Edition, Basic Edition ou Data Lakehouse Edition

  • V3.1.9.3 ou ultérieure

Spécifiez un groupe de ressources de tâches à l'aide de MV_PROPERTIES. L'exemple suivant crée une vue matérialisée en utilisant le groupe de ressources de tâches my_job_rg avec une priorité élevée et une actualisation quotidienne :

CREATE MATERIALIZED VIEW job_mv
MV_PROPERTIES='{
  "mv_resource_group": "my_job_rg",
  "mv_refresh_hints": {"query_priority": "HIGH"}
}'
REFRESH COMPLETE ON DEMAND
START WITH now()
NEXT now() + INTERVAL 1 DAY
AS
SELECT * FROM customer;

Pour limiter les ressources maximales utilisées pendant l'actualisation, ajoutez "elastic_job_max_acu": "<value>" à mv_refresh_hints. Pour la liste complète des options mv_properties, consultez mv_properties.

Mécanismes de déclenchement de l'actualisation

Une vue matérialisée reflète ses données telles qu'elles étaient lors de la dernière actualisation, et non l'état actuel des tables de base. Choisissez un déclencheur d'actualisation en fonction de la fraîcheur requise pour les données :

  • Actualisation automatique planifiée : Actualise à intervalle fixe (par exemple, toutes les 3 minutes, tous les jours). Prise en charge par les actualisations complètes et rapides.

  • Actualisation automatique lors de l'écrasement d'une table de base : Déclenche une actualisation lorsqu'une table de base est écrasée. Pris en charge uniquement par l'actualisation complète.

  • Actualisation manuelle : Exécutez REFRESH MATERIALIZED VIEW <view_name>; lorsque cela est nécessaire. Pris en charge uniquement par l'actualisation complète.

Pour plus de détails sur les politiques d'actualisation et la syntaxe d'actualisation manuelle, consultez Actualiser les vues matérialisées.

Contraintes des requêtes pour les vues matérialisées incrémentielles

Le corps de la requête SELECT d'une vue matérialisée rapide présente des contraintes qui ne s'appliquent pas aux vues à actualisation complète. La contrainte la plus restrictive est la suivante :

Important

Seules les jointures INNER JOIN sont prises en charge. Les colonnes de jointure doivent être des colonnes originales des tables de base, avoir des types de données identiques et être indexées. Vous pouvez joindre jusqu'à cinq tables de base.

Si une contrainte empêche l'utilisation souhaitée, optez pour une vue matérialisée à actualisation complète, qui prend en charge la syntaxe SELECT complète sans restriction de jointure.

Le tableau suivant répertorie toutes les fonctionnalités SQL non prises en charge.

Fonctionnalité

Prise en charge ?

Remarques

INNER JOIN (multi-tables)

Oui (V3.2.1.0+)

Jusqu'à 5 tables ; les colonnes de jointure doivent être indexées et avoir des types de données correspondants

UNION ALL

Oui (V3.2.5.0+)

Nécessite une structure de requête spéciale (voir ci-dessous)

COUNT, SUM, MAX, MIN, AVG, APPROX_DISTINCT, COUNT(DISTINCT)

Oui

Toutes les autres fonctions d'agrégation ne sont pas prises en charge

AVG avec DECIMAL

Non

Utilisez un autre type numérique

COUNT(DISTINCT) avec un type non INTEGER

Non

Prend en charge uniquement le type INTEGER

Fonctions de fenêtrage

Non

—

Clause HAVING

Non

—

Clause ORDER BY

Non

—

Expressions non déterministes (NOW(), RAND())

Non

—

UNION, EXCEPT, INTERSECT

Non

UNION ALL est pris en charge à partir de la version V3.2.5.0

Tables XUANWU_V2 comme tables de base

Non (avant V3.2.6.0)

XUANWU_V2 prend en charge la journalisation binaire à partir de la version V3.2.6.0

Tables partitionnées comme tables de base

Non (avant V3.2.3.0)

—

INSERT OVERWRITE ou TRUNCATE sur les tables de base

Non (avant V3.2.3.1)

Renvoie une erreur

MAX(), MIN(), APPROX_DISTINCT(), COUNT(DISTINCT) avec DELETE/UPDATE/REPLACE/INSERT ON DUPLICATE KEY UPDATE

Non

Les tables de base prennent en charge uniquement INSERT

Vue matérialisée rapide comme table de base (vues matérialisées rapides imbriquées)

Oui (V3.2.5.0+)

Nécessite l'activation de la journalisation binaire sur la vue matérialisée

Pour joindre plus de cinq tables dans une vue matérialisée rapide, contactez le support technique.

Règles relatives aux colonnes SELECT

Les colonnes de la liste SELECT doivent respecter les règles suivantes :

  • Avec GROUP BY et des fonctions d'agrégation : Incluez toutes les colonnes GROUP BY dans la liste SELECT.

    Afficher des exemples

    Exemple correct (toutes les colonnes GROUP BY sont incluses) :

    CREATE MATERIALIZED VIEW demo_mv1
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT
      sale_id,    -- GROUP BY column
      sale_date,  -- GROUP BY column
      max(quantity) AS max,  -- expression columns require aliases
      sum(price) AS sum
    FROM sales
    GROUP BY sale_id, sale_date;

    Incorrect (colonne GROUP BY sale_date manquante) :

    CREATE MATERIALIZED VIEW false_mv1
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT
      sale_id,
      max(quantity) AS max,
      sum(price) AS sum
    FROM sales
    GROUP BY sale_id, sale_date;  -- sale_date is in GROUP BY but not in SELECT
  • Avec des fonctions d'agrégation et sans GROUP BY : La liste SELECT ne peut contenir que des colonnes d'agrégation, ou uniquement des colonnes constantes et d'agrégation.

    Afficher des exemples

    -- Aggregate columns only
    CREATE MATERIALIZED VIEW demo_mv2
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT
      max(quantity) AS max,
      sum(price) AS sum
    FROM sales;
    
    -- Constant plus aggregate columns (the constant becomes the primary key)
    CREATE MATERIALIZED VIEW demo_mv3
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT
      1 AS pk,
      max(quantity) AS max,
      sum(price) AS sum
    FROM sales;
  • Sans agrégation : Incluez toutes les colonnes de clé primaire de la table de base.

    Afficher des exemples

    -- Single primary key
    CREATE MATERIALIZED VIEW demo_mv4
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT
      sale_id,   -- primary key column of base table sales
      quantity
    FROM sales;
    
    -- Composite primary key: PRIMARY KEY(sale_id, sale_date)
    CREATE MATERIALIZED VIEW demo_mv5
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT
      sale_id,    -- first primary key column
      sale_date,  -- second primary key column
      quantity
    FROM sales1;
  • Requêtes UNION ALL : Chaque branche doit produire une colonne nommée union_all_marker avec une valeur constante distincte par branche. Incluez toutes les colonnes de clé primaire des tables de base. La clé primaire de la vue matérialisée doit inclure à la fois les colonnes de clé primaire de la table de base et union_all_marker.

    CREATE MATERIALIZED VIEW demo_union_all_mv (PRIMARY KEY(id, union_all_marker))
    REFRESH FAST NEXT now() + INTERVAL 5 minute
    AS
    SELECT customer_id AS id, "customer" AS union_all_marker
    FROM customer
    UNION ALL
    SELECT sale_id AS id, "sales" AS union_all_marker
    FROM sales;
  • Colonnes d'expression : Toutes les colonnes d'expression de la liste SELECT doivent avoir des alias, par exemple SUM(price) AS total_price.

Limites

Limites générales

Ces limites s'appliquent à toutes les vues matérialisées.

  • Vous ne pouvez pas exécuter INSERT, DELETE ou UPDATE sur une vue matérialisée.

  • Vous ne pouvez pas supprimer ni renommer une table de base ou ses colonnes tant qu'une vue matérialisée les référence. Supprimez d'abord la vue matérialisée, puis modifiez la table de base.

  • Nombre maximal de vues matérialisées par cluster :

    • V3.1.4.7 ou ultérieure : 64

    • Antérieure à V3.1.4.7 : 8

Pour augmenter le quota, contactez le support technique.

Limites des vues matérialisées à actualisation complète

Lorsque vous ajoutez ou supprimez des nœuds réservés, les tâches asynchrones sont désactivées. Étant donné que l'actualisation complète est une tâche asynchrone, elle ne peut pas s'exécuter pendant la mise à l'échelle des nœuds. L'actualisation rapide n'est pas affectée.

Limites des vues matérialisées rapides (incrémentielles)

Consultez Contraintes des requêtes pour les vues matérialisées incrémentielles pour la liste complète des restrictions SQL.

Déclencheur d'actualisation : Seule l'actualisation automatique planifiée est prise en charge. L'intervalle doit être compris entre 5 secondes et 5 minutes.

Limitations des jointures multi-tables dans les vues matérialisées incrémentielles :

  • Jusqu'à cinq tables de base peuvent être jointes.

  • Pour ajuster cette limite, afin de contacter le support technique en fonction des spécifications de votre cluster.
  • Seules les jointures INNER JOIN sont prises en charge.

  • Les colonnes de jointure doivent être des colonnes originales des tables de base, avoir des types de données identiques et être indexées.

FAQ

Comment conserver uniquement les données de l'année la plus récente dans une vue matérialisée ?

Utilisez une colonne de date comme clé de partition (PARTITION BY) et définissez une valeur LIFECYCLE pour limiter le nombre de partitions conservées. Pour une vue partitionnée par jour, définissez LIFECYCLE 365 afin de conserver les 365 partitions les plus récentes (un an).

Exemple : la table sales reçoit de nouveaux enregistrements quotidiennement, partitionnés par sale_date :

CREATE MATERIALIZED VIEW sales_mv_lifecycle
PARTITION BY VALUE(DATE_FORMAT(sale_date, '%Y%m%d')) LIFECYCLE 365
REFRESH FAST NEXT now() + INTERVAL 100 second
AS
SELECT
  sale_date,
  SUM(price * quantity) AS price
FROM sales
GROUP BY sale_date;

Dépannage

Erreur d'exécution de requête : Impossible de créer une vue matérialisée FAST, car demotable ne prend pas en charge l'obtention de données incrémentielles

La journalisation binaire n'est pas activée pour la table de base demotable. Activez-la avec :

ALTER TABLE demotable binlog=true;

Si vous voyez XUANWU_V2 engine not support ALTER_BINLOG_ENABLE now, la table de base utilise le moteur XUANWU_V2 et le cluster exécute une version du noyau antérieure à V3.2.6.0. XUANWU_V2 prend en charge la journalisation binaire à partir de la version du noyau V3.2.6.0. Mettez à niveau le cluster vers la version V3.2.6.0 ou ultérieure, puis exécutez à nouveau ALTER TABLE demotable binlog=true; pour activer la journalisation binaire sur la table de base.

Erreur d'exécution de requête : La clé primaire id doit être envoyée vers la MV

Votre vue matérialisée rapide utilise une requête non agrégée sans GROUP BY. Dans ce cas, la liste SELECT doit inclure toutes les colonnes de clé primaire de la table de base.

Incorrect (sale_id manquante, qui est la clé primaire de sales) :

CREATE MATERIALIZED VIEW wrong_example1
REFRESH FAST ON DEMAND
 NEXT now() + interval 200 second
AS
SELECT product_id, price
FROM sales;

Ajoutez la colonne de clé primaire :

CREATE MATERIALIZED VIEW correct_example1
REFRESH FAST ON DEMAND
 NEXT now() + interval 200 second
AS
SELECT sale_id, product_id, price
FROM sales;

Erreur d'exécution de requête : La clé primaire de la MV doit être égale à la clé primaire de la table de base

Votre vue matérialisée rapide utilise une requête non agrégée sans GROUP BY, et la définition de la clé primaire de la vue matérialisée inclut des colonnes qui ne font pas partie de la clé primaire de la table de base.

Incorrect (product_id n'est pas une colonne de clé primaire de sales) :

CREATE MATERIALIZED VIEW wrong_example2
(PRIMARY KEY(sale_id, product_id))
REFRESH FAST ON DEMAND
 NEXT now() + interval 200 second
AS
SELECT sale_id, product_id, price
FROM sales;

Supprimez les colonnes non clés primaires de la définition de la clé primaire :

CREATE MATERIALIZED VIEW correct_example2
(PRIMARY KEY(sale_id))
REFRESH FAST ON DEMAND
 NEXT now() + interval 200 second
AS
SELECT sale_id, product_id, price
FROM sales;

Erreur d'exécution de requête : La vue matérialisée FAST doit définir une clé primaire

Cette erreur a deux causes possibles :

  • Aucune clé primaire valide définie. Mettez à jour la définition de la vue matérialisée pour respecter ces règles :

    • Requête d'agrégation groupée (avec GROUP BY) : la clé primaire doit correspondre aux colonnes GROUP BY (par exemple, si GROUP BY a, b, définissez PRIMARY KEY(a, b)).

    • Requête d'agrégation non groupée (sans GROUP BY) : la clé primaire doit être une constante.

    • Requête non agrégée : la clé primaire doit correspondre exactement à la clé primaire de la table de base (par exemple, si la table de base a PRIMARY KEY(sale_id, sale_date), la vue doit également avoir PRIMARY KEY(sale_id, sale_date)).

  • Une fonction est appliquée à une colonne de clé primaire. Supprimez la fonction de la colonne de clé primaire dans la requête.

Erreur d'exécution de requête : Le graphe de jointure n'est pas pris en charge

Les colonnes de jointure ont des types de données incompatibles. Par exemple, si customer.id et sales.id ont des types différents, la jointure échoue. Alignez les types avec :

ALTER TABLE tablename MODIFY COLUMN columnname newtype;

Pour plus d'informations, consultez Modifier le type de données d'une colonne.

Erreur d'exécution de requête : Impossible d'utiliser la jointure d'index pour actualiser cette MV rapide

Les colonnes de jointure manquent d'index. Ajoutez un index sur chaque colonne de jointure :

ALTER TABLE tablename ADD KEY idx_name(columnname);

Pour plus d'informations, consultez Créer un index.

Erreur d'exécution de requête : La requête a dépassé la limite de mémoire réservée

La requête a dépassé la limite de mémoire par nœud. Utilisez la fonctionnalité diagnostics SQL pour identifier les étapes et opérateurs gourmands en mémoire (Agrégation, TopN, Fenêtrage et Jointure sont les coupables courants), puis optimisez ces opérateurs. Consultez également Métriques de mémoire et Utiliser les détails des étapes et des tâches pour analyser les requêtes.

Étapes suivantes