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érationsINSERT,DELETEetUPDATE) 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 :
| 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 :
| Avantages :
|
Limites :
|
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 VIEWpour 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ètreNEXT, 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 clauseNEXT.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;
INSERT OVERWRITE INTOet les opérationsTRUNCATEsont 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;etALTER TABLE <table_name> binlog=false;.
Vues matérialisées à table unique
-
Créez une vue matérialisée à table unique
fast_mv1qui 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_mv2qui 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_mv3qui 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_mv4qui 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_mv5qui 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 OVERWRITEetTRUNCATEne 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 VIEWrenvoie une erreur.Les conditions ne peuvent pas contenir d'expressions non déterministes, telles que
now()ourand().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 VIEWnom_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
Créer une vue matérialisée : Décrit les cas d'utilisation, les fonctionnalités clés et les limites des vues matérialisées.
CREATE MATERIALIZED VIEW : Fournit la syntaxe complète.
Gérer les vues matérialisées : Explique comment interroger les définitions des vues matérialisées, consulter les historiques d'actualisation, modifier les vues matérialisées et supprimer les vues matérialisées.