Créez une vue matérialisée prenant en charge le clustering ou le partitionnement selon les données, adaptée aux scénarios de vues matérialisées.
Contexte
Une vue est une table virtuelle définie par une requête. En revanche, une vue matérialisée est une table physique qui stocke les résultats de requêtes précalculés et consomme des ressources de stockage. Pour plus de détails sur la facturation, consultez les Règles de facturation.
Les vues matérialisées conviennent aux scénarios suivants :
Requêtes fréquemment exécutées suivant un modèle fixe.
Requêtes impliquant des opérations chronophages, telles que les agrégations et les jointures.
Requêtes n'accédant qu'à un petit sous-ensemble des données d'une table.
Le tableau ci-dessous compare les requêtes traditionnelles aux requêtes utilisant des vues matérialisées.
Élément | Requête traditionnelle | Requête avec vue matérialisée |
Instruction de requête | Vous interrogez directement les données à l'aide d'instructions SQL. | Créez une vue matérialisée, puis interrogez-la. L'instruction suivante crée une vue matérialisée : Interrogez la vue matérialisée : Si la réécriture de requête est activée pour la vue matérialisée, le système utilise automatiquement cette dernière lorsque vous exécutez la requête suivante : |
Caractéristiques de la requête | La requête lit les tables, effectue des jointures et applique des filtres (clause WHERE). Pour les tables source volumineuses, ces opérations sont lentes et gourmandes en ressources. | La requête lit la vue matérialisée et applique des filtres. Aucune jointure n'est nécessaire. MaxCompute fait correspondre automatiquement la requête à la vue matérialisée optimale et lit les données directement depuis celle-ci, ce qui améliore considérablement les performances. |
Règles de facturation
Les coûts liés aux vues matérialisées se composent de deux éléments :
-
Frais de stockage
Les vues matérialisées consomment du stockage physique, entraînant des frais de stockage facturés selon le mode de paiement à l'utilisation. Pour plus d'informations, consultez les Tarifs du stockage (paiement à l'utilisation).
-
Coûts de calcul
La création, la mise à jour et l'interrogation d'une vue matérialisée — y compris les réécritures de requête lorsque la vue est valide — consomment des ressources de calcul et engendrent des coûts de calcul.
Si votre projet MaxCompute est souscrit à un plan d'abonnement , aucun frais supplémentaire n'est facturé.
-
Si votre projet MaxCompute est souscrit à un plan en paiement à l'utilisation, MaxCompute calcule les coûts en fonction de la complexité SQL et du volume de données d'entrée. Pour plus d'informations, consultez les sections Tarification SQL Standard. Notez les points suivants :
L'instruction SQL utilisée pour actualiser une vue matérialisée est identique à sa requête de définition. Si le projet est lié à un groupe de ressources de calcul sous abonnement, l'opération utilise vos ressources achetées sans coût supplémentaire. Si le projet utilise un groupe de ressources en paiement à l'utilisation, le coût dépend du volume de données d'entrée et de la complexité SQL. Après une actualisation, des frais de stockage sont facturés en fonction de la taille réelle de la vue matérialisée.
Lorsqu'une vue matérialisée est valide, la réécriture de requête lit les données depuis la vue. Le volume de données d'entrée dépend de la vue matérialisée, et non de la table source. Si la vue n'est pas valide, la réécriture de requête est indisponible et les requêtes lisent directement depuis la table source. Pour plus d'informations, consultez la section Vérifier le statut d'une vue matérialisée.
Lorsqu'une vue matérialisée est construite à partir de jointures multi-tables, un gonflement des données peut survenir. La lecture depuis la vue matérialisée ne réduit pas toujours les coûts par rapport à la lecture depuis les tables sources.
Limites
Les fonctions de fenêtrage, les fonctions tabulaires définies par l'utilisateur (UDTF) et les fonctions non déterministes telles que les fonctions scalaires définies par l'utilisateur (UDF) et les fonctions d'agrégation définies par l'utilisateur (UDAF) ne sont pas prises en charge.
Si vous devez utiliser une fonction non déterministe, définissez cette propriété au niveau de la session : set odps.sql.materialized.view.support.nondeterministic.function=true;.
Précautions
Si l'exécution de l'instruction de requête sur laquelle repose la création d'une vue matérialisée échoue, vous ne pouvez pas créer la vue matérialisée.
Les colonnes de clé de partition dans une vue matérialisée doivent provenir d'une table source. La séquence et le nombre de colonnes dans la vue matérialisée doivent être identiques à ceux de la table source. Les noms de colonnes peuvent différer.
Vous devez spécifier des commentaires pour toutes les colonnes, y compris les colonnes de clé de partition. Si vous spécifiez des commentaires uniquement pour certaines colonnes, une erreur est renvoyée.
Vous pouvez spécifier à la fois les attributs de partitionnement et de clustering pour une vue matérialisée. Dans ce cas, les données de chaque partition possèdent l'attribut de clustering spécifié.
Si l'instruction de requête sur laquelle repose la création d'une vue matérialisée contient des opérateurs non pris en charge par les vues matérialisées, une erreur est renvoyée. Pour plus d'informations sur les opérateurs pris en charge, consultez la section Effectuer une opération de réécriture de requête basée sur une vue matérialisée.
Par défaut, MaxCompute ne permet pas de créer des vues matérialisées à l'aide de fonctions non déterministes, telles que les UDF ou les UDAF. Si vous devez utiliser des fonctions non déterministes pour répondre à vos besoins métier, exécutez la commande
set odps.sql.materialized.view.support.nondeterministic.function=true;au niveau de la session.Si la table source d'une vue matérialisée contient une partition vide, vous pouvez actualiser la vue matérialisée pour générer une partition vide dans celle-ci.
Syntaxe
CREATE MATERIALIZED VIEW [IF NOT EXISTS] [project_name.]<mv_name>
[LIFECYCLE <days>] --Specifies the lifecycle.
[BUILD DEFERRED] --Creates the schema without populating data.
[(<col_name> [COMMENT <col_comment>], ...)] --Column comments.
[DISABLE REWRITE] --Specifies whether the materialized view can be used for query rewrite.
[COMMENT 'table comment'] --Table comment.
[PARTITIONED BY (<col_name> [, <col_name>, ...])] --Creates the materialized view as a partitioned table.
[CLUSTERED BY | RANGE CLUSTERED BY (<col_name> [, <col_name>, ...])
[SORTED BY (<col_name> [ASC | DESC] [, <col_name> [ASC | DESC] ...])]
INTO <number_of_buckets> BUCKETS] --Sets the shuffle and sort properties for a clustered table.
[REFRESH EVERY <num> {MINUTES | HOURS | DAYS}]
[TBLPROPERTIES("compressionstrategy"="{normal|high|extreme}", --Specifies the data storage compression strategy for the table.
"enable_auto_substitute"="true", --Specifies whether to enable query passthrough to the source table when a partition does not exist.
"enable_auto_refresh"="true", --Specifies whether to enable automatic refresh.
"refresh_interval_minutes"="120", --Specifies the refresh interval.
"only_refresh_max_pt"="true" --For partitioned materialized views, automatically refreshes only the latest partition from the source table.
)]
AS <select_statement>;
Paramètres
Paramètre | Obligatoire | Description |
IF NOT EXISTS | Non | Si vous ne spécifiez pas IF NOT EXISTS et que la vue matérialisée existe déjà, l'opération échoue avec une erreur. |
project_name | Non | Nom du projet MaxCompute pour la vue matérialisée. Si vous omettez ce paramètre, le projet actuel est utilisé.
|
mv_name | Oui | Nom de la vue matérialisée. |
days | Non | Durée de vie de la vue matérialisée en jours. La valeur doit être un entier compris entre 1 et 37231. |
BUILD DEFERRED | Non | Si spécifié, crée le schéma de la vue matérialisée sans la remplir de données. |
col_name | Non | Nom d'une colonne dans la vue matérialisée. |
col_comment | Non | Commentaire pour une colonne. |
DISABLE REWRITE | Non | Désactive la réécriture de requête pour la vue matérialisée. Par défaut, la réécriture de requête est activée. Vous pouvez exécuter |
PARTITIONED BY | Non | Colonnes de clé de partition. Utilisez ce paramètre pour créer une vue matérialisée partitionnée. |
CLUSTERED BY|RANGE CLUSTERED BY | Non | Propriété de brassage (shuffle) pour la création d'une table clusterisée. |
SORTED BY | Non | Propriété de tri pour la création d'une table clusterisée. |
REFRESH EVERY | Non | Intervalle d'actualisation planifié pour la vue matérialisée. Les unités valides sont MINUTES, HOURS ou DAYS. |
number_of_buckets | Non | Nombre de buckets lors de la création d'une table clusterisée. |
TBLPROPERTIES | Non |
|
select_statement | Oui | Instruction SELECT définissant la vue matérialisée. Pour plus d'informations, consultez la section Syntaxe SELECT. |
Exemples
Créer une vue matérialisée
-
Créez les tables nommées
mf_tetmf_t1et insérez-y des données.CREATE TABLE IF NOT EXISTS mf_t( id bigint, value bigint, name string) PARTITIONED BY (ds STRING); ALTER TABLE mf_t ADD PARTITION (ds='1'); INSERT INTO mf_t PARTITION (ds='1') VALUES (1,10,'kyle'),(2,20,'xia'); SELECT * FROM mf_t WHERE ds ='1'; -- The following result is returned. +------------+------------+------------+------------+ | id | value | name | ds | +------------+------------+------------+------------+ | 1 | 10 | kyle | 1 | | 2 | 20 | xia | 1 | +------------+------------+------------+------------+ CREATE TABLE IF NOT EXISTS mf_t1( id bigint, value bigint, name string) PARTITIONED BY (ds STRING); ALTER TABLE mf_t1 ADD PARTITION (ds='1'); INSERT INTO mf_t1 PARTITION (ds='1') VALUES (1,10,'kyle'),(3,20,'john'); SELECT * FROM mf_t1 WHERE ds ='1'; -- The following result is returned. +------------+------------+------------+------------+ | id | value | name | ds | +------------+------------+------------+------------+ | 1 | 10 | kyle | 1 | | 3 | 20 | john | 1 | +------------+------------+------------+------------+ -
Créez une vue matérialisée.
-
Exemple 1 : Créez une vue matérialisée contenant une colonne de clé de partition nommée ds.
CREATE MATERIALIZED VIEW mf_mv LIFECYCLE 7 ( key comment 'unique id', value comment 'input value', ds comment 'partition' ) PARTITIONED BY (ds) AS SELECT t1.id AS key, t1.value AS value, t1.ds AS ds FROM mf_t AS t1 JOIN mf_t1 AS t2 ON t1.id = t2.id AND t1.ds=t2.ds AND t1.ds='1'; --Query the materialized view. SELECT * FROM mf_mv WHERE ds =1; +------------+------------+------------+ | key | value | ds | +------------+------------+------------+ | 1 | 10 | 1 | +------------+------------+------------+ -
Exemple 2 : Créez une vue matérialisée non partitionnée et clusterisée.
CREATE MATERIALIZED VIEW mf_mv2 LIFECYCLE 7 CLUSTERED BY (key) SORTED BY (value) INTO 1024 buckets AS SELECT t1.id AS key, t1.value AS value, t1.ds AS ds FROM mf_t AS t1 JOIN mf_t1 AS t2 ON t1.id = t2.id AND t1.ds=t2.ds AND t1.ds='1'; -
Exemple 3 : Créez une vue matérialisée partitionnée et clusterisée.
CREATE MATERIALIZED VIEW mf_mv3 LIFECYCLE 7 PARTITIONED BY (ds) CLUSTERED BY (key) SORTED BY (value) INTO 1024 buckets AS SELECT t1.id AS key, t1.value AS value, t1.ds AS ds FROM mf_t AS t1 JOIN mf_t1 AS t2 ON t1.id = t2.id AND t1.ds=t2.ds AND t1.ds='1';
-
Mettre en œuvre la réécriture de requête basée sur une vue matérialisée
-
Scénario
Considérons une table de visites de pages nommée
visit_recordsqui enregistre l'ID de page, l'ID utilisateur et l'heure de visite pour chaque consultation. Une tâche d'analyse fréquente consiste à compter le nombre de visites pour différentes pages.Dans cette situation, vous pouvez créer une vue matérialisée sur
visit_recordsqui regroupe les données par ID de page et compte les visites pour chaque page. Vous pouvez ensuite exécuter des requêtes ultérieures contre cette vue matérialisée.La structure de
visit_recordsest la suivante :+------------------------------------------------------------------------------------+ | Field | Type | Label | Comment | +------------------------------------------------------------------------------------+ | page_id | string | | | | user_id | string | | | | visit_time | string | | | +------------------------------------------------------------------------------------+ -
Créez une vue matérialisée.
-- Create a materialized view for the visit_records table that groups by page ID and counts the visits for each page. CREATE MATERIALIZED VIEW count_mv AS SELECT page_id, count(*) FROM visit_records GROUP BY page_id; -
Exécutez la requête suivante :
SET odps.sql.materialized.view.enable.auto.rewriting=true; SELECT page_id, count(*) FROM visit_records GROUP BY page_id;Lorsque cette instruction de requête est exécutée, MaxCompute fait automatiquement correspondre la vue matérialisée
count_mvet lit les données pré-agrégées depuiscount_mv. -
Pour vérifier que la requête a été réécrite à l'aide de la vue matérialisée, exécutez la commande
EXPLAINsuivante :EXPLAIN SELECT page_id, count(*) FROM visit_records GROUP BY page_id;Le résultat suivant est renvoyé :
job0 is root job In Job job0: root Tasks: M1 In Task M1: Data source: doc_test_dev.count_mv TS: doc_test_dev.count_mv FS: output: Screen schema: page_id (string) _c1 (bigint) OKLa source de données
Data sourcedans le résultat renvoyé indique que la table lue par la requête est la vuecount_mvdu projetdoc_test_dev. Cela signifie que la vue matérialisée est effective et que la réécriture de requête a réussi.
Effectuer une réécriture de requête basée sur une vue matérialisée
La fonctionnalité principale des vues matérialisées consiste à réécrire les instructions de requête. Pour activer la réécriture de requête basée sur une vue matérialisée, vous devez ajouter set odps.sql.materialized.view.enable.auto.rewriting=true; avant l'instruction de requête. Si une vue matérialisée n'est pas valide, elle ne peut pas être utilisée pour la réécriture de requête. Dans ce cas, les données sont interrogées directement depuis la table source et la vitesse d'exécution de la requête n'est pas améliorée.
Par défaut, un projet MaxCompute ne peut utiliser que ses propres vues matérialisées pour la réécriture de requête. Si vous souhaitez effectuer une réécriture de requête basée sur les vues matérialisées d'autres projets MaxCompute, vous devez ajouter set odps.sql.materialized.view.source.project.white.list=<project_name1>,<project_name2>,<project_name3>; avant les instructions de requête afin de spécifier les projets MaxCompute concernés.
Le tableau suivant compare les types d'opérateurs de réécriture de requête pris en charge par MaxCompute avec ceux d'autres produits.
Type d'opérateur | Classification | MaxCompute | BigQuery | Amazon Redshift | Hive |
FILTER | Correspondance d'expression complète | Pris en charge | Pris en charge | Pris en charge | Pris en charge |
Correspondance d'expression partielle | Pris en charge | Pris en charge | Pris en charge | Pris en charge | |
AGGREGATE | Agrégation unique | Pris en charge | Pris en charge | Pris en charge | Pris en charge |
Agrégations multiples | Non pris en charge | Non pris en charge | Non pris en charge | Non pris en charge | |
JOIN | Type de JOIN | INNER JOIN | Non pris en charge | INNER JOIN | INNER JOIN |
JOIN unique | Pris en charge | Non pris en charge | Pris en charge | Pris en charge | |
JOINs multiples | Pris en charge | Non pris en charge | Pris en charge | Pris en charge | |
AGGREGATE+JOIN | - | Pris en charge | Non pris en charge | Pris en charge | Pris en charge |
Les opérations de réécriture de requête basées sur une vue matérialisée exigent que les données d'une instruction de requête soient obtenues à partir de la vue matérialisée. Ces données incluent les colonnes de sortie, les colonnes requises par les opérations de filtrage, les colonnes nécessaires aux fonctions d'agrégation et les colonnes utilisées dans les opérations JOIN. Si les colonnes requises dans l'instruction de requête ne figurent pas dans la vue matérialisée ou ne sont pas prises en charge par les fonctions d'agrégation, la réécriture de requête basée sur la vue matérialisée est impossible.
Exemple 1 : Réécriture avec des conditions de filtrage
-
Créez une vue matérialisée.
CREATE MATERIALIZED VIEW mv AS SELECT a,b,c FROM src WHERE a>5; -
Le tableau suivant présente des exemples de réécriture pour la vue matérialisée.
Requête d'origine
Requête réécrite
SELECT a,b FROM src WHERE a>5;SELECT a,b FROM mv;SELECT a, b FROM src WHERE a=10;SELECT a,b FROM mv WHERE a=10;SELECT a, b FROM src WHERE a=10 AND b='3';SELECT a,b FROM mv WHERE a=10 AND b=3;SELECT a, b FROM src WHERE a>3;(SELECT a,b FROM src WHERE a>3 AND a<=5) UNION (SELECT a,b FROM mv);SELECT a, b FROM src WHERE a=10 AND d=4;Échec de la réécriture car la vue matérialisée ne contient pas la colonne
d.SELECT d, e FROM src WHERE a=10;Échec de la réécriture car la vue matérialisée ne contient pas les colonnes
dete.SELECT a, b FROM src WHERE a=1;Échec de la réécriture car la vue matérialisée ne contient pas de données où
a=1.
Exemple 2 : Réécriture avec des fonctions d'agrégation
Toutes les fonctions d'agrégation peuvent être réécrites si la vue matérialisée et la requête partagent la même clé d'agrégation. Si les clés d'agrégation diffèrent, seules les réécritures utilisant SUM, MIN et MAX sont prises en charge.
-
Créez une vue matérialisée.
CREATE MATERIALIZED VIEW mv AS SELECT a, b, sum(c) AS sum, count(d) AS cnt FROM src GROUP BY a, b; -
Le tableau suivant illustre la réécriture des requêtes basée sur la vue matérialisée.
Requête d'origine
Requête réécrite
SELECT a, sum(c) FROM src GROUP BY a;SELECT a, sum(sum) FROM mv GROUP BY a;SELECT a, count(d) FROM src GROUP BY a, b;SELECT a, cnt FROM mv;SELECT a, count(b) FROM (SELECT a, b FROM src GROUP BY a, b) GROUP BY a;SELECT a,count(b) FROM mv GROUP BY a;SELECT a,count(b) FROM mv GROUP BY a;Échec de la réécriture car la vue a déjà agrégé les colonnes
aetb, donc la colonnebne peut pas être agrégée à nouveau.SELECT a, count(c) FROM src GROUP BY a;Échec de la réécriture car la ré-agrégation de la fonction
COUNTn'est pas prise en charge.
Si une fonction d'agrégation contient DISTINCT, la requête ne peut être réécrite que si la vue matérialisée et la requête d'origine possèdent la même clé d'agrégation. Dans le cas contraire, la réécriture est impossible.
-
Créez une vue matérialisée.
CREATE MATERIALIZED VIEW mv AS SELECT a, b, sum(DISTINCT c) AS sum, count(DISTINCT d) AS cnt FROM src GROUP BY a, b; -
Le tableau suivant illustre la réécriture des requêtes basée sur la vue matérialisée.
Requête d'origine
Requête réécrite
SELECT a, count(DISTINCT d) FROM src GROUP BY a, b;SELECT a, cnt FROM mv;SELECT a, count(c) FROM src GROUP BY a, b;Échec de la réécriture car la ré-agrégation de la fonction
COUNTn'est pas prise en charge.SELECT a, count(DISTINCT c) FROM src GROUP BY a;Échec de la réécriture car la colonne
anécessite une autre agrégation.
Exemple 3 : Réécriture avec une clause JOIN
Réécriture des entrées JOIN
-
Créez des vues matérialisées.
CREATE MATERIALIZED VIEW mv1 AS SELECT a, b FROM j1 WHERE b > 10; CREATE MATERIALIZED VIEW mv2 AS SELECT a, b FROM j2 WHERE b > 10; -
Le tableau suivant illustre la réécriture des requêtes basée sur les vues matérialisées.
Requête d'origine
Requête réécrite
SELECT j1.a,j1.b,j2.a FROM (SELECT a,b FROM j1 WHERE b > 10) j1 JOIN j2 ON j1.a=j2.a;SELECT mv1.a, mv1.b, j2.a FROM mv1 JOIN j2 ON mv1.a=j2.a;SELECT j1.a,j1.b,j2.a FROM (SELECT a,b FROM j1 WHERE b > 10) j1 JOIN (SELECT a,b FROM j2 WHERE b > 10) j2 ON j1.a=j2.a;SELECT mv1.a,mv1.b,mv2.a FROM mv1 JOIN mv2 ON mv1.a=mv2.a;
JOIN avec des conditions de filtrage
-
Créez des vues matérialisées.
--Create a non-partitioned materialized view. CREATE MATERIALIZED VIEW mv1 AS SELECT j1.a, j1.b FROM j1 JOIN j2 ON j1.a=j2.a; CREATE MATERIALIZED VIEW mv2 AS SELECT j1.a, j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j1.a > 10; --Create a partitioned materialized view. CREATE MATERIALIZED VIEW mv LIFECYCLE 7 PARTITIONED BY (ds) AS SELECT t1.id, t1.ds AS ds FROM t1 JOIN t2 ON t1.id = t2.id; -
Le tableau suivant illustre la réécriture des requêtes basée sur les vues matérialisées.
Requête d'origine
Requête réécrite
SELECT j1.a,j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j1.a=4;SELECT a, b FROM mv1 WHERE a=4;SELECT j1.a,j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j1.a > 20;SELECT a,b FROM mv2 WHERE a>20;SELECT j1.a,j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j1.a > 5;(SELECT j1.a,j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j1.a > 5 AND j1.a <= 10) UNION SELECT * FROM mv2;SELECT key FROM t1 JOIN t2 ON t1.id= t2.id WHERE t1.ds='20210306';SELECT key FROM mv WHERE ds='20210306';SELECT key FROM t1 JOIN t2 ON t1.id= t2.id WHERE t1.ds>='20210306';SELECT key FROM mv WHERE ds>='20210306';SELECT j1.a,j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j2.a=4;Échec de la réécriture car la vue matérialisée ne contient pas la colonne
j2.a.
Extension d'un JOIN
-
Créez une vue matérialisée.
CREATE MATERIALIZED VIEW mv AS SELECT j1.a, j1.b FROM j1 JOIN j2 ON j1.a=j2.a; -
Le tableau suivant illustre la réécriture des requêtes basée sur la vue matérialisée.
Requête d'origine
Requête réécrite
SELECT j1.a, j1.b FROM j1 JOIN j2 JOIN j3 ON j1.a=j2.a AND j1.a=j3.a;SELECT mv.a, mv.b FROM mv JOIN j3 ON mv.a=j3.a;SELECT j1.a, j1.b FROM j1 JOIN j2 JOIN j3 ON j1.a=j2.a AND j2.a=j3.a;SELECT mv.a,mv.b FROM mv JOIN j3 ON mv.a=j3.a;
Ces trois scénarios de réécriture JOIN peuvent être combinés.
L'objectif de la réécriture de requête via une vue matérialisée étant d'accélérer les requêtes, MaxCompute privilégie les règles de réécriture offrant les meilleures performances. Une règle n'est pas appliquée si elle introduit des opérations qui entraîneraient une faible accélération.
Exemple 4 : Réécriture avec une clause LEFT JOIN
-
Créez une vue matérialisée.
CREATE MATERIALIZED VIEW mv LIFECYCLE 7( user_id, job, total_amount ) AS SELECT t1.user_id, t1.job, sum(t2.order_amount) AS total_amount FROM user_info AS t1 LEFT JOIN sale_order AS t2 ON t1.user_id=t2.user_id GROUP BY t1.user_id; -
Le tableau suivant illustre la réécriture d'une requête basée sur la vue matérialisée.
Requête d'origine
Requête réécrite
SELECT t1.user_id, sum(t2.order_amount) AS total_amount FROM user_info AS t1 LEFT JOIN sale_order AS t2 ON t1.user_id=t2.user_id GROUP BY t1.user_id;SELECT user_id, total_amount FROM mv;
Exemple 5 : Réécriture avec une clause UNION ALL
-
Créez une vue matérialisée.
CREATE MATERIALIZED VIEW mv LIFECYCLE 7( user_id, tran_amount, tran_date ) AS SELECT user_id, tran_amount, tran_date FROM alipay_tran UNION ALL SELECT user_id, tran_amount, tran_date FROM unionpay_tran; -
Le tableau suivant illustre la réécriture d'une requête basée sur la vue matérialisée.
Requête d'origine
Requête réécrite
SELECT user_id, tran_amount FROM alipay_tran UNION ALL SELECT user_id, tran_amount FROM unionpay_tran;SELECT user_id, tran_amount FROM mv;
Transparence des requêtes sur les vues matérialisées
Une vue matérialisée partitionnée peut ne pas contenir de données pour toutes les partitions, par exemple si vous actualisez uniquement les plus récentes. Lorsqu'une requête cible une partition dépourvue de données dans la vue matérialisée, le système revient automatiquement à la table source partitionnée. La figure suivante illustre ce processus.

Pour activer la fonctionnalité de requête transparente pour une vue matérialisée, définissez le paramètre suivant :
Lors de la création de la vue matérialisée, ajoutez la configuration "enable_auto_substitute"="true" aux tblproperties.
L'exemple suivant montre comment utiliser une vue matérialisée prenant en charge les requêtes transparentes.
-
Créez une vue matérialisée partitionnée prenant en charge les requêtes transparentes.
-- Create a source table named src. CREATE TABLE src(id bigint,name string) PARTITIONED BY (dt string); -- Insert data. INSERT INTO src PARTITION(dt='20210101') VALUES(1,'Alex'); INSERT INTO src PARTITION(dt='20210102') VALUES(2,'Flink'); -- Create a partitioned materialized view that supports penetration query. CREATE MATERIALIZED VIEW IF NOT EXISTS mv LIFECYCLE 7 PARTITIONED BY (dt) tblproperties("enable_auto_substitute"="true") AS SELECT id, name, dt FROM src; -
Interrogez les données de la partition
20210101dans la vue matérialiséemv.SELECT * FROM mv WHERE dt='20210101'; -
Interrogez les données de la partition
20210102dans la vue matérialiséemv. Le système effectue automatiquement une requête transparente sur la table source car cette partition n'est pas matérialisée.SELECT * FROM mv WHERE dt = '20210102'; -- Because the data for the 20210102 partition is not materialized, the query is rewritten to access the source table. This is equivalent to: SELECT * FROM (SELECT id, name, dt FROM src WHERE dt='20210102') t; -
Interrogez les données d'une plage de partitions dans la vue matérialisée
mv. Le système effectue automatiquement une requête transparente sur la table source pour les données non matérialisées et les combine avec les données matérialisées à l'aide d'une opérationUNIONavant de renvoyer le résultat.SELECT * FROM mv WHERE dt >= '20201230' AND dt<='20210102' AND id=5; -- Because data for partitions 20201230 and 20210102 is not materialized, the query is rewritten to access the source table. This is equivalent to: SELECT * FROM (SELECT id, name, dt FROM src WHERE dt='20201230' OR dt='20210102' UNION ALL SELECT * FROM mv WHERE dt='20210101' ) t WHERE id = 5;
Instructions connexes
ALTER MATERIALIZED VIEW : met à jour une vue matérialisée, modifie son cycle de vie, active ou désactive la fonctionnalité de cycle de vie, ou supprime des partitions d'une vue matérialisée.
DESC TABLE/VIEW : affiche les informations relatives à une vue matérialisée dans un projet MaxCompute.
SELECT MATERIALIZED VIEW : interroge le statut d'une vue matérialisée.
DROP MATERIALIZED VIEW : supprime une vue matérialisée existante.