Tous les produits
Search
Centre de documentation

MaxCompute:CREATE MATERIALIZED VIEW

Dernière mise à jour :Sep 17, 2026

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.

SELECT empid, deptname  
FROM emps JOIN depts 
ON emps.deptno=depts.deptno 
WHERE hire_date >= '2018-01-01';

Créez une vue matérialisée, puis interrogez-la.

L'instruction suivante crée une vue matérialisée :

CREATE MATERIALIZED VIEW mv 
    AS SELECT empid, deptname, hire_date  
    FROM emps JOIN depts 
    ON emps.deptno=depts.deptno 
    WHERE hire_date >= '2016-01-01';

Interrogez la vue matérialisée :

SELECT empid, deptname FROM mv 
    WHERE hire_date >= '2018-01-01';

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 :

SELECT empid, deptname 
    FROM emps JOIN depts 
    ON emps.deptno=depts.deptno 
    WHERE hire_date >= '2018-01-01';
    -- This is equivalent to the following statement.
    SELECT empid, deptname FROM mv 
    WHERE hire_date >= '2018-01-01';

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.

Remarque

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é.

  1. Connectez-vous à la console MaxCompute et sélectionnez une région dans le coin supérieur gauche.

  2. Dans le volet de navigation de gauche, choisissez Manage Configurations > Projects.

    Consultez le nom de votre projet.

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 ALTER MATERIALIZED VIEW [project_name.]<mv_name> DISABLE REWRITE; pour désactiver la réécriture de requête, et ALTER MATERIALIZED VIEW [project_name.]<mv_name> ENABLE REWRITE; pour l'activer.

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

  • compressionstrategy : Spécifie la stratégie de compression du stockage des données. Les valeurs valides sont normal, high et extreme. enable_auto_substitute : Indique s'il faut activer le passage de requête vers la table source partitionnée lorsqu'une partition n'existe pas. Pour plus d'informations, consultez la section Réécriture de requête de vue matérialisée.

  • enable_auto_refresh : Facultatif. Définissez cette propriété sur true pour activer l'actualisation automatique des données.

  • refresh_interval_minutes : Ce paramètre est requis uniquement lorsque enable_auto_refresh est défini sur true. Il spécifie l'intervalle d'actualisation en minutes.

  • only_refresh_max_pt : Facultatif. Cette propriété s'applique uniquement aux vues matérialisées partitionnées. Si elle est définie sur true, seule la dernière partition de la table source est actualisée.

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

  1. Créez les tables nommées mf_t et mf_t1 et 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          |
    +------------+------------+------------+------------+
  2. 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

  1. Scénario

    Considérons une table de visites de pages nommée visit_records qui 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_records qui 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_records est la suivante :

    +------------------------------------------------------------------------------------+
    | Field           | Type       | Label | Comment                                     |
    +------------------------------------------------------------------------------------+
    | page_id         | string     |       |                                             |
    | user_id         | string     |       |                                             |
    | visit_time      | string     |       |                                             |
    +------------------------------------------------------------------------------------+
  2. 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;
  3. 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_mv et lit les données pré-agrégées depuis count_mv.

  4. Pour vérifier que la requête a été réécrite à l'aide de la vue matérialisée, exécutez la commande EXPLAIN suivante :

    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)
    
    OK

    La source de données Data source dans le résultat renvoyé indique que la table lue par la requête est la vue count_mv du projet doc_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.

Remarque

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

  1. Créez une vue matérialisée.

    CREATE MATERIALIZED VIEW mv AS SELECT a,b,c FROM src WHERE a>5;
  2. 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 d et e.

    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.

  1. 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;
  2. 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 a et b, donc la colonne b ne 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 COUNT n'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.

  1. 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;
  2. 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 COUNT n'est pas prise en charge.

    SELECT a, count(DISTINCT c) FROM src GROUP BY a;

    Échec de la réécriture car la colonne a nécessite une autre agrégation.

Exemple 3 : Réécriture avec une clause JOIN

Réécriture des entrées JOIN

  1. 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;
  2. 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

  1. 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;
  2. 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

  1. 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;
  2. 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

  1. 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;
  2. 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

  1. 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;
  2. 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.

Illustration de la transparence des requêtes

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.

  1. 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;
  2. Interrogez les données de la partition 20210101 dans la vue matérialisée mv.

    SELECT * FROM mv WHERE dt='20210101';
  3. Interrogez les données de la partition 20210102 dans la vue matérialisée mv. 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;
  4. 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ération UNION avant 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.