Cette rubrique décrit l'instruction CREATE MATERIALIZED VIEW. Utilisez cette instruction pour créer une vue matérialisée avec une politique d'actualisation complète ou incrémentielle (fast refresh) et définir son calendrier d'actualisation.
Syntaxe
CREATE [OR REPLACE] MATERIALIZED VIEW mv_name
[mv_definition]
[mv_properties]
[COMMENT 'view_comment']
[REFRESH {COMPLETE|FAST}]
[ON {DEMAND|OVERWRITE}]
[START WITH date] [NEXT date]
[{DISABLE|ENABLE} QUERY REWRITE]
AS
query_body
mv_definition:
({column_name column_type [column_attributes] [ column_constraints ] [COMMENT 'column_comment']
| table_constraints}
[, ... ])
[table_attribute]
[partition_options]
[index_all]
[storage_policy]
[block_size]
[engine]
[table_properties]
Paramètres
OR REPLACE |
Facultatif |
Modifiable après la création : Non |
|
Ce paramètre est pris en charge uniquement par les clusters dont la version du noyau est 3.1.4.7 ou ultérieure.
|
|||
mv_definition |
Facultatif |
Modifiable après la création : Non |
|
|
Définit le schéma de la vue matérialisée. Si vous omettez cette clause, le système déduit le schéma à partir du corps de la requête (query_body). Par défaut, le système définit une clé primaire, crée des index sur toutes les colonnes, définit la stratégie de stockage sur le stockage chaud et utilise le moteur XUANWU. Pour définir manuellement le schéma d'une vue matérialisée, y compris sa clé de distribution, sa clé de partition, sa clé primaire, ses index et sa stratégie de stockage des données chaudes/froides, utilisez la même syntaxe que l'instruction CREATE TABLE. Par exemple, si vous ne souhaitez pas indexer toutes les colonnes, utilisez le mot-clé Règles relatives à la clé primaire
RecommandationsPour des performances de requête optimales, nous vous recommandons de définir une clé primaire, une clé de distribution et une clé de partition lors de la création d'une vue matérialisée. |
|||
mv_properties |
Facultatif |
Modifiable après la création : Oui (en utilisant ALTER MATERIALIZED VIEW) |
|
Ce paramètre est pris en charge uniquement par les clusters Enterprise Edition, Basic Edition et Data Lakehouse Edition dont la version du noyau est 3.1.9.3 ou ultérieure. Définit la stratégie de ressources pour la vue matérialisée. Cela inclut
mv_resource_groupSpécifie le groupe de ressources utilisé pour créer et actualiser la vue matérialisée. S'il n'est pas spécifié, le groupe de ressources par défaut La valeur de ce paramètre peut être un groupe de ressources Interactive ou Job du moteur XIHE. La différence réside dans le fait que les groupes de ressources Job provisionnent les ressources à la demande, ce qui introduit généralement une latence de quelques secondes ou minutes. Si vous tolérez bien la latence d'actualisation, spécifiez un groupe de ressources Job. Une vue matérialisée utilisant un groupe de ressources Job est également appelée vue matérialisée élastique. Pour augmenter la vitesse d'actualisation d'une vue matérialisée élastique, configurez le paramètre elastic_job_max_acu dans Vous pouvez afficher les groupes de ressources disponibles pour votre cluster sur la page Resource Groups de la console ou en appelant l'opération DescribeDBResourceGroup. L'opération échoue si le groupe de ressources spécifié n'existe pas. mv_refresh_hintsSpécifie les paramètres de configuration de la vue matérialisée. Pour obtenir la liste des paramètres pris en charge et leur utilisation, consultez la section Hints courants. |
|||
REFRESH [COMPLETE | FAST] |
Facultatif |
Valeur par défaut : COMPLETE |
Modifiable après la création : Non |
|
Définit la politique d'actualisation de la vue matérialisée. Pour plus d'informations sur les différences entre les politiques d'actualisation et leurs cas d'utilisation, consultez la section Sélectionner une politique d'actualisation. COMPLETEUne actualisation complète exécute le SQL de la requête d'origine pour analyser les données de toutes les partitions cibles de la table de base et remplace entièrement les anciennes données par les données nouvellement calculées. L'actualisation complète prend en charge les mécanismes de déclenchement d'actualisation FASTCe paramètre est pris en charge dans les versions 3.1.9.0 et ultérieures. La version 3.1.9.0 prend en charge l'actualisation incrémentielle uniquement pour les vues matérialisées mono-table. Les versions 3.2.0.0 et ultérieures prennent en charge l'actualisation incrémentielle pour les vues matérialisées mono-table et multi-table. Effectue une actualisation incrémentielle. Le système réécrit la requête de la vue ( Avant de créer une vue matérialisée utilisant l'actualisation incrémentielle, activez la fonctionnalité de journalisation binaire (binary logging) pour le cluster et les tables de base. Sinon, la création échouera. Pour obtenir des instructions, consultez la section Activer la fonctionnalité de journalisation binaire. Pour une vue matérialisée utilisant l'actualisation incrémentielle, le mécanisme de déclenchement de l'actualisation doit être une actualisation automatique planifiée. Définissez la prochaine heure d'actualisation en utilisant L'actualisation incrémentielle présente certaines limitations. Si le |
|||
ON [DEMAND | OVERWRITE] |
Facultatif |
Valeur par défaut : DEMAND |
Modifiable après la création : Non |
|
Définit le mécanisme de déclenchement de l'actualisation de la vue matérialisée. Pour plus d'informations sur les différences entre les mécanismes de déclenchement et leurs cas d'utilisation, consultez la section Sélectionner un mécanisme de déclenchement d'actualisation. DEMANDActualisation à la demande. Cela signifie que vous pouvez actualiser manuellement la vue matérialisée lorsque cela est nécessaire, ou utiliser Les vues matérialisées à actualisation incrémentielle prennent uniquement en charge OVERWRITELa vue matérialisée est automatiquement actualisée après que les données de sa table de base ont été écrasées par une instruction Lorsque le mécanisme de déclenchement de l'actualisation est |
|||
[START WITH date] [NEXT date] |
Facultatif |
Modifiable après la création : Non |
|
|
Lorsque le mécanisme de déclenchement de l'actualisation d'une vue matérialisée est START WITHL'heure de la première actualisation. Si omis, la vue est actualisée immédiatement après sa création. NEXTL'heure de la prochaine actualisation planifiée.
dateLes fonctions temporelles sont prises en charge. L'heure est précise à la seconde près et les millisecondes sont tronquées. |
|||
[DISABLE | ENABLE] QUERY REWRITE |
Facultatif |
Valeur par défaut : DISABLE |
Modifiable après la création : Oui (en utilisant ALTER MATERIALIZED VIEW) |
Ce paramètre est pris en charge uniquement dans les versions 3.1.4 et ultérieures. Active ou désactive la réécriture automatique des requêtes pour cette vue matérialisée. Pour plus d'informations, consultez la section Réécriture de requête pour les vues matérialisées. DISABLEDésactive la fonctionnalité de réécriture de requête pour la vue matérialisée actuelle. ENABLEActive la fonctionnalité de réécriture de requête pour la vue matérialisée actuelle. Après activation, l'optimiseur peut réécrire tout ou partie d'une requête en fonction de son modèle SQL et la rediriger vers la vue matérialisée. Cela évite d'exécuter les calculs d'origine sur la table de base et améliore les performances des requêtes. |
|||
query_body |
Obligatoire |
Modifiable après la création : Non |
|
|
Définit la requête sur les tables de base pour la vue matérialisée. Pour une vue matérialisée utilisant l'actualisation complète, la table de base peut être une table interne AnalyticDB for MySQL, une table externe, une vue matérialisée existante ou une vue. Il n'y a aucune restriction sur la requête. Pour plus d'informations sur la syntaxe des requêtes, consultez SELECT. Pour une vue matérialisée utilisant l'actualisation incrémentielle, la table de base doit être une table interne AnalyticDB for MySQL. La requête doit respecter les règles suivantes : Règles relatives aux colonnes SELECTLes colonnes de la liste SELECT doivent respecter les règles suivantes :
Autres limitations
|
|||
Autorisations requises
L'utilisateur qui crée la vue matérialisée doit disposer de toutes les autorisations suivantes :
L'autorisation CREATE sur la base de données où la vue matérialisée sera créée.
L'autorisation SELECT sur les colonnes pertinentes (ou sur la table entière) pour toutes les tables de base de la vue matérialisée.
-
Pour créer une vue matérialisée actualisée automatiquement, vous avez également besoin des deux autorisations suivantes :
L'autorisation de se connecter à AnalyticDB for MySQL depuis n'importe quelle adresse IP (c'est-à-dire
'%').L'autorisation
INSERTsur la vue matérialisée ou sur toutes les tables de la base de données où réside la vue matérialisée. Sinon, le système ne pourra pas actualiser les données de la vue matérialisée.
Exemples
Prérequis
Les exemples de cette rubrique utilisent les tables de base créées dans cette section. Pour exécuter les exemples, commencez par créer les tables de base à l'aide des instructions SQL suivantes.
/+ RC_DDL_ENGINE_REWRITE_XUANWUV2=false / -- Définit le moteur de table sur XUANWU. CREATE TABLE customer ( customer_id INT PRIMARY KEY, customer_name VARCHAR(255), is_vip Boolean ); /+ RC_DDL_ENGINE_REWRITE_XUANWUV2=false / -- Définit le moteur de table sur 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 / -- Spécifie que la table utilise le moteur XUANWU. CREATE TABLE sales ( sale_id INT PRIMARY KEY, product_id INT, customer_id INT, price DECIMAL(10, 2), quantity INT, sale_date TIMESTAMP );
Vue matérialisée à actualisation complète
-
Créez la vue matérialisée
myview1, qui s'actualise toutes les 5 minutes.CREATE MATERIALIZED VIEW myview1 REFRESH -- Equivalent to REFRESH COMPLETE NEXT now() + INTERVAL 5 minute AS SELECT count(*) as cnt FROM customer; -
Créez la vue matérialisée
myview2, qui s'actualise tous les jours à 2 h 00.CREATE MATERIALIZED VIEW myview2 REFRESH COMPLETE 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 count(*) as cnt FROM customer; -
Créez une vue matérialisée
myview3qui s'actualise tous les lundis à 2 h 00.CREATE MATERIALIZED VIEW myview3 REFRESH COMPLETE ON DEMAND START WITH DATE_FORMAT(now() + INTERVAL 7 - weekday(now()) day, '%Y-%m-%d 02:00:00') NEXT DATE_FORMAT(now() + INTERVAL 7 - weekday(now()) day, '%Y-%m-%d 02:00:00') AS SELECT count(*) as cnt FROM customer; -
Créez la vue matérialisée
myview4, qui est actualisée à 2 h 00 le premier jour de chaque mois.CREATE MATERIALIZED VIEW myview4 REFRESH -- Equivalent to REFRESH COMPLETE NEXT DATE_FORMAT(last_day(now()) + INTERVAL 1 day, '%Y-%m-%d 02:00:00') AS SELECT count(*) as cnt FROM customer; -
Créez la vue matérialisée
myview5et actualisez-la une seule fois.CREATE MATERIALIZED VIEW myview5 REFRESH -- Equivalent to REFRESH COMPLETE START WITH now() + INTERVAL 1 day AS SELECT count(*) as cnt FROM customer; -
Créez la vue matérialisée
myview6qui n'est pas actualisée automatiquement et repose entièrement sur des actualisations manuelles.CREATE MATERIALIZED VIEW myview6 ( PRIMARY KEY (customer_id) ) DISTRIBUTED BY HASH (customer_id) AS SELECT customer_id FROM customer;Actualisez manuellement la vue matérialisée :
REFRESH MATERIALIZED VIEW myview6; -
Créez la vue matérialisée
myview7. Vous n'avez pas besoin de définir manuellement une heure d'actualisation car la vue matérialisée est automatiquement actualisée après que la table de base a été écrasée par une opérationINSERT OVERWRITE.CREATE MATERIALIZED VIEW myview7 REFRESH COMPLETE ON OVERWRITE AS SELECT count(*) as cnt FROM customer;
Vue matérialisée mono-table à actualisation incrémentielle
Avant de créer une vue matérialisée utilisant l'actualisation incrémentielle, activez la fonctionnalité de journalisation binaire pour le cluster et les tables de base.
SET ADB_CONFIG BINLOG_ENABLE=true;
ALTER TABLE customer binlog=true;
ALTER TABLE sales binlog=true;
-
Créez une vue matérialisée mono-table nommée
fast_mv1avec actualisation incrémentielle et sans agrégation. Elle 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 mono-table nommée
fast_mv2avec actualisation incrémentielle et une agrégation groupée. Elle 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 automatically includes 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 -- Any expression can be used in the condition. GROUP BY customer_id, sale_date; -
Créez une vue matérialisée mono-table nommée
fast_mv3avec actualisation incrémentielle et une agrégation non groupée. Elle s'actualise toutes les minutes.CREATE MATERIALIZED VIEW fast_mv3 REFRESH FAST NEXT now() + INTERVAL 1 minute AS SELECT count(*) AS cnt -- The system automatically generates a constant primary key to ensure only one record exists in the materialized view. FROM sales;
Vue matérialisée multi-table à actualisation incrémentielle
-
Créez une vue matérialisée multi-table nommée
fast_mv4avec actualisation incrémentielle et sans agrégation. Elle 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, s.sale_id, (s.price * s.quantity) AS revenue FROM sales s JOIN customer c ON s.customer_id = c.customer_id; -
Créez une vue matérialisée multi-table nommée
fast_mv5avec actualisation incrémentielle et une agrégation groupée. Elle 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, COUNT(*) AS cnt, SUM(s.price * s.quantity) AS revenue FROM sales s JOIN (SELECT customer_id, customer_name FROM customer) c ON c.customer_id = s.customer_id GROUP BY s.sale_id, c.customer_name;
Vue matérialisée partitionnée
Créez la vue matérialisée myview8 et définissez la clé de distribution et la clé de partition.
CREATE MATERIALIZED VIEW myview8 (
quantity INT, -- The materialized view includes all columns from the query results even if they are not explicitly listed in the definition.
price DECIMAL(10, 2),
sale_date TIMESTAMP
)
DISTRIBUTED BY HASH(sale_id)
PARTITION BY VALUE(date_format(sale_date, "%Y%m%d")) LIFECYCLE 30
AS
SELECT * FROM sales;
Définir les clés et les index
-
Créez la vue matérialisée
myview9, en créant un index uniquement sur la colonne spécifiéecustomer_nameau lieu de toutes les colonnes.CREATE MATERIALIZED VIEW myview9 ( INDEX (sale_date), PRIMARY KEY (sale_id) ) DISTRIBUTED BY HASH (sale_id) REFRESH NEXT now() + INTERVAL 1 DAY AS SELECT * FROM sales; -
Créez une vue matérialisée nommée
myview10avec une clé primaire, une clé de distribution, un index de clustering, des index sur des colonnes spécifiées et un commentaire.CREATE MATERIALIZED VIEW myview10 ( quantity INT, -- The materialized view includes all columns from the query results even if they are not explicitly listed in the definition. price DECIMAL(10, 2), KEY INDEX_ID(customer_id) COMMENT 'customer', CLUSTERED KEY INDEX(sale_id), PRIMARY KEY(sale_id,sale_date) ) DISTRIBUTED BY HASH(sale_id) COMMENT 'MATERIALIZED VIEW c' AS SELECT * FROM sales;
Vue matérialisée élastique
-
Créez la vue matérialisée élastique
myview11, en utilisant le groupe de ressources de type Jobserverlesspour la créer et l'actualiser, avec une fréquence d'actualisation d'une fois par jour.CREATE MATERIALIZED VIEW myview11 MV_PROPERTIES='{ "mv_resource_group":"serverless" }' REFRESH COMPLETE ON DEMAND START WITH now() NEXT now() + INTERVAL 1 DAY AS SELECT * FROM sales; -
Créez la vue matérialisée élastique
myview12, qui utilise le groupe de ressources de type Jobserverlesspour la création et les actualisations, et peut utiliser 12 ACU de ressources de ce groupe.CREATE MATERIALIZED VIEW myview12 MV_PROPERTIES='{ "mv_resource_group":"serverless", "mv_refresh_hints":{"elastic_job_max_acu":"12"} }' REFRESH COMPLETE ON DEMAND START WITH now() NEXT now() + INTERVAL 1 DAY AS SELECT * FROM sales;
Rubriques connexes
Vues matérialisées: Découvrez les cas d'utilisation et les mises à jour des fonctionnalités des vues matérialisées.
Créer une vue matérialisée: Apprenez à créer une vue matérialisée et trouvez des solutions aux erreurs courantes.
Actualiser une vue matérialisée: Apprenez à effectuer une actualisation complète ou incrémentielle sur une vue matérialisée.
Gérer les vues matérialisées: Apprenez à afficher la définition d'une vue matérialisée, à lister toutes les vues matérialisées et à supprimer une vue matérialisée.