Todos os produtos
Search
Central de documentação

MaxCompute:Reescrita de consultas em visualizações materializadas

Última atualização: Oct 16, 2026

O MaxCompute permite reescrever consultas SQL originais para usar uma visualização materializada quando as consultas contêm condições de filtro ou determinados tipos de operadores.

Notas de uso

  • O princípio fundamental da reescrita de consultas em visualizações materializadas é que a visualização materializada deve conter todos os dados exigidos pela consulta. Isso inclui as colunas de saída e quaisquer colunas usadas em condições de filtro, funções de agregação ou condições de JOIN. O MaxCompute não reescreve a consulta se ela exigir colunas ausentes na visualização materializada ou se usar uma função de agregação não suportada.

  • Para ativar a reescrita de consultas em visualizações materializadas, adicione a seguinte configuração antes da sua instrução de consulta:

    SET odps.sql.materialized.view.enable.auto.rewriting=true;

    A reescrita de consultas não é suportada quando a visualização materializada está em um estado inválido. Nesse caso, o sistema executa a consulta diretamente na tabela de origem, sem aceleração.

  • Reescrita entre projetos

    Por padrão, um projeto do MaxCompute só pode usar suas próprias visualizações materializadas para a reescrita de consultas. Para usar visualizações materializadas de outros projetos, especifique uma lista de projetos do MaxCompute permitidos adicionando a seguinte configuração antes da sua consulta:

    SET odps.sql.materialized.view.source.project.white.list = <project_name1>,<project_name2>,<project_name3>;
  • Para ativar reescritas que usam visualizações materializadas definidas com LEFT/RIGHT JOIN ou UNION ALL, adicione a seguinte configuração antes da sua instrução de consulta:

    SET odps.sql.materialized.view.enable.substitute.rewriting=true;

Tipos de operadores suportados

A tabela a seguir compara os tipos de operadores de reescrita de consultas suportados pelo MaxCompute com os de outros produtos.

Tipo de operador

Classificação

MaxCompute

BigQuery

Amazon Redshift

Hive

FILTER

Correspondência total de expressão

Suportado

Suportado

Suportado

Suportado

Correspondência parcial de expressão

Suportado

Suportado

Suportado

Suportado

AGGREGATE

AGGREGATE único

Suportado

Suportado

Suportado

Suportado

Múltiplos AGGREGATEs

Não suportado

Não suportado

Não suportado

Não suportado

JOIN

Tipo de JOIN

INNER JOIN

Não suportado

INNER JOIN

INNER JOIN

JOIN único

Suportado

Não suportado

Suportado

Suportado

Múltiplos JOINs

Suportado

Não suportado

Suportado

Suportado

AGGREGATE+JOIN

-

Suportado

Não suportado

Suportado

Suportado

Exemplos

Exemplo 1: Reescrita com condições de filtro

  1. Crie uma visualização materializada.

    CREATE MATERIALIZED VIEW mv AS SELECT a,b,c FROM src WHERE a>5;
  2. A tabela a seguir apresenta exemplos de reescrita para a visualização materializada.

    Consulta original

    Consulta reescrita

    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;

    A reescrita falha porque a visualização materializada não contém a coluna d.

    SELECT d, e FROM src WHERE a=10;

    A reescrita falha porque a visualização materializada não contém as colunas d e e.

    SELECT a, b FROM src WHERE a=1;

    A reescrita falha porque a visualização materializada não contém dados onde a=1.

Exemplo 2: Reescrita com funções de agregação

Todas as funções de agregação podem ser reescritas se a visualização materializada e a consulta compartilharem a mesma chave de agregação. Se as chaves de agregação forem diferentes, apenas as reescritas que usam SUM, MIN e MAX são suportadas.

  1. Crie uma visualização materializada.

    CREATE MATERIALIZED VIEW mv AS 
    SELECT a, b, sum(c) AS sum, count(d) AS cnt FROM src GROUP BY a, b;
  2. A tabela a seguir mostra como as consultas são reescritas com base na visualização materializada.

    Consulta original

    Consulta reescrita

    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;

    A reescrita falha porque a visualização já agregou as colunas a e b, impedindo uma nova agregação da coluna b.

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

    A reescrita falha porque o sistema não suporta a reagregação da função COUNT.

Se uma função de agregação contiver DISTINCT, o MaxCompute só reescreve a consulta se a visualização materializada e a consulta original tiverem a mesma chave de agregação. Caso contrário, a reescrita não será possível.

  1. Crie uma visualização materializada.

    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. A tabela a seguir mostra como as consultas são reescritas com base na visualização materializada.

    Consulta original

    Consulta reescrita

    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;

    A reescrita falha porque o sistema não suporta a reagregação da função COUNT.

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

    A reescrita falha porque a coluna a exige outra agregação.

Exemplo 3: Reescrita com uma cláusula JOIN

Reescrita de entradas de JOIN

  1. Crie visualizações materializadas.

    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. A tabela a seguir mostra como as consultas são reescritas com base nas visualizações materializadas.

    Consulta original

    Consulta reescrita

    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 com condições de filtro

  1. Crie visualizações materializadas.

    --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. A tabela a seguir mostra como as consultas são reescritas com base nas visualizações materializadas.

    Consulta original

    Consulta reescrita

    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;

    A reescrita falha porque a visualização materializada não contém a coluna j2.a.

Extensão de um JOIN

  1. Crie uma visualização materializada.

    CREATE MATERIALIZED VIEW mv AS SELECT j1.a, j1.b FROM j1 JOIN j2 ON j1.a=j2.a;
  2. A tabela a seguir mostra como as consultas são reescritas com base na visualização materializada.

    Consulta original

    Consulta reescrita

    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;

É possível combinar esses três cenários de reescrita de JOIN.

Como o objetivo da reescrita de consultas em visualizações materializadas é acelerar as consultas, o MaxCompute prioriza as regras de reescrita que oferecem o melhor desempenho. O sistema não aplica uma regra se ela introduzir operações que resultem em baixa aceleração.

Exemplo 4: Reescrita com uma cláusula LEFT JOIN

  1. Crie uma visualização materializada.

    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, t1.job;
  2. A tabela a seguir mostra como uma consulta é reescrita com base na visualização materializada.

    Consulta original

    Consulta reescrita

    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;

Exemplo 5: Reescrita com uma cláusula UNION ALL

  1. Crie uma visualização materializada.

    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. A tabela a seguir mostra como uma consulta é reescrita com base na visualização materializada.

    Consulta original

    Consulta reescrita

    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;

Exemplo 6: Caso de uso

  1. Cenário

    Considere uma tabela de visitas de página chamada visit_records que registra o ID da página, o ID do usuário e o horário da visita para cada acesso. Uma tarefa de análise frequente é contar o número de visitas para diferentes páginas.

    Nessa situação, crie uma visualização materializada em visit_records que agrupe por ID da página e conte as visitas de cada página. Em seguida, execute consultas subsequentes nessa visualização materializada.

    A estrutura de visit_records é a seguinte:

    +------------------------------------------------------------------------------------+
    | Field           | Type       | Label | Comment                                     |
    +------------------------------------------------------------------------------------+
    | page_id         | string     |       |                                             |
    | user_id         | string     |       |                                             |
    | visit_time      | string     |       |                                             |
    +------------------------------------------------------------------------------------+
  2. Crie uma visualização materializada.

    -- 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. Execute a seguinte consulta:

    SET odps.sql.materialized.view.enable.auto.rewriting=true; 
    SELECT page_id, count(*) FROM visit_records GROUP BY page_id;

    Quando essa instrução de consulta é executada, o MaxCompute corresponde automaticamente à visualização materializada count_mv e lê os dados pré-agregados de count_mv.

  4. Para verificar se a consulta foi reescrita usando a visualização materializada, execute o seguinte comando EXPLAIN:

    EXPLAIN SELECT page_id, count(*) FROM visit_records GROUP BY page_id;

    O sistema retorna o seguinte resultado:

    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

    O Data source no resultado retornado mostra que a tabela lida pela consulta é a count_mv do projeto doc_test_dev. Isso indica que a visualização materializada está ativa e a reescrita da consulta foi bem-sucedida.

Documentos relacionados