Todos os produtos
Search
Central de documentação

MaxCompute:CREATE MATERIALIZED VIEW

Última atualização: Sep 17, 2026

Cria uma materialized view com suporte a clustering ou particionamento, adequada para cenários que utilizam esse recurso.

Contexto

Uma view é uma tabela virtual definida por uma consulta. Já a materialized view é uma tabela física que armazena resultados pré-computados e consome recursos de armazenamento. Para detalhes sobre faturamento, consulte Billing rules.

As materialized views são indicadas para os seguintes cenários:

  • Consultas executadas frequentemente com um padrão fixo.

  • Consultas que envolvem operações demoradas, como agregações e joins.

  • Consultas que acessam apenas um pequeno subconjunto de dados de uma tabela.

A tabela a seguir compara consultas tradicionais com consultas em materialized views.

Item

Consulta tradicional

Consulta em materialized view

Instrução de consulta

Consulte dados diretamente usando instruções SQL.

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

Crie uma materialized view e depois consulte-a.

A instrução a seguir cria uma materialized view:

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';

Consulte a materialized view:

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

Se a reescrita de consulta estiver ativada para a materialized view, o sistema usará automaticamente a materialized view ao executar a seguinte consulta:

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';

Características da consulta

A consulta lê tabelas, executa joins e aplica filtros (cláusula WHERE). Em tabelas source grandes, essas operações são lentas e consomem muitos recursos.

A consulta lê a materialized view e aplica filtros, sem necessidade de joins. O MaxCompute associa automaticamente a consulta à materialized view ideal e lê os dados diretamente dela, o que melhora significativamente o desempenho.

Regras de faturamento

Os custos de uma materialized view dividem-se em dois componentes:

  • Taxas de armazenamento

    As materialized views consomem armazenamento físico, gerando taxas de armazenamento no modelo de pagamento conforme o uso. Para mais informações, consulte Storage pricing (pay-as-you-go).

  • Custos de computação

    Criar, atualizar e consultar uma materialized view — incluindo reescritas de consulta quando a view é válida — consome recursos de computação e gera custos correspondentes.

    • Se o seu projeto MaxCompute estiver em um plano de assinatura , não haverá cobrança separada.

    • Caso o projeto MaxCompute esteja em um plano de pagamento conforme o uso , o MaxCompute calcula os custos com base na complexidade do SQL e no volume de dados de entrada. Para mais informações, consulte Standard SQL pricing. Observe o seguinte:

      • A instrução SQL usada para atualizar uma materialized view é a mesma da consulta que a define. Se o projeto estiver vinculado a um grupo de recursos de computação por assinatura, a operação utilizará os recursos adquiridos sem custo adicional. Se o projeto usar um grupo de recursos de pagamento conforme o uso, o custo dependerá do volume de dados de entrada e da complexidade do SQL. Após a atualização, as taxas de armazenamento serão cobradas com base no tamanho real da materialized view.

      • Quando a materialized view é válida, a reescrita de consulta lê dados diretamente da view. O volume de dados de entrada depende da materialized view, e não da tabela source. Se a view estiver inválida, a reescrita de consulta ficará indisponível e as consultas lerão dados diretamente da tabela source. Para mais informações, consulte Query materialized view status.

      • Quando uma materialized view é construída a partir de joins de múltiplas tabelas, pode ocorrer inflação de dados. A leitura da materialized view nem sempre reduz custos em comparação à leitura das tabelas source.

Limitações

Funções de janela, funções com valor de tabela definidas pelo usuário (UDTFs) e funções não determinísticas, como funções escalares definidas pelo usuário (UDFs) e funções de agregação definidas pelo usuário (UDAFs), não são suportadas.

Nota

Se for necessário usar uma função não determinística, defina esta propriedade no nível de sessão: set odps.sql.materialized.view.support.nondeterministic.function=true;.

Precauções

  • Se a execução da instrução de consulta usada como base para criar a materialized view falhar, não será possível criar a materialized view.

  • As colunas de chave de partição em uma materialized view devem ser derivadas de uma tabela source. A sequência e a quantidade de colunas na materialized view devem corresponder exatamente às da tabela source. Os nomes das colunas podem ser diferentes.

  • Especifique comentários para todas as colunas, inclusive as de chave de partição. Se você definir comentários apenas para algumas colunas, um erro será retornado.

  • É possível especificar tanto os atributos de particionamento quanto os de clustering para uma materialized view. Nesse caso, os dados de cada partição terão o atributo de clustering especificado.

  • Caso a instrução de consulta usada para criar a materialized view contenha operadores não suportados por ela, um erro será retornado. Para mais informações sobre os operadores suportados por materialized views, consulte Perform a query rewrite operation based on a materialized view.

  • Por padrão, o MaxCompute não permite a criação de materialized views usando funções não determinísticas, como UDFs ou UDAFs. Se seus requisitos de negócio exigirem o uso dessas funções, execute o comando set odps.sql.materialized.view.support.nondeterministic.function=true; no nível de sessão.

  • Se a tabela source de uma materialized view contiver uma partição vazia, atualize a materialized view para gerar uma partição vazia correspondente nela.

Sintaxe

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>;

Parâmetros

Parâmetro

Obrigatório

Descrição

IF NOT EXISTS

Não

Se você não especificar IF NOT EXISTS e a materialized view já existir, a operação falhará com um erro.

project_name

Não

Nome do projeto MaxCompute ao qual a materialized view pertence. Se este parâmetro for omitido, o projeto atual será usado.

  1. Faça login no MaxCompute console e selecione uma região no canto superior esquerdo.

  2. No painel de navegação à esquerda, escolha Manage Configurations > Projects.

    Visualize o nome do seu projeto.

mv_name

Sim

Nome da materialized view.

days

Não

Ciclo de vida da materialized view em dias. O valor deve ser um número inteiro entre 1 e 37231.

BUILD DEFERRED

Não

Se especificado, cria o esquema da materialized view sem preenchê-lo com dados.

col_name

Não

Nome de uma coluna na materialized view.

col_comment

Não

Comentário de uma coluna.

DISABLE REWRITE

Não

Desativa a reescrita de consulta para a materialized view. Por padrão, a reescrita de consulta está ativada. Execute ALTER MATERIALIZED VIEW [project_name.]<mv_name> DISABLE REWRITE; para desativar a reescrita de consulta e ALTER MATERIALIZED VIEW [project_name.]<mv_name> ENABLE REWRITE; para ativá-la.

PARTITIONED BY

Não

Colunas de chave de partição. Use este parâmetro para criar uma materialized view particionada.

CLUSTERED BY|RANGE CLUSTERED BY

Não

Propriedade de shuffle para criar uma tabela clusterizada.

SORTED BY

Não

Propriedade de ordenação para criar uma tabela clusterizada.

REFRESH EVERY

Não

Intervalo de atualização agendada da materialized view. As unidades válidas são MINUTES, HOURS ou DAYS.

number_of_buckets

Não

Número de buckets ao criar uma tabela clusterizada.

TBLPROPERTIES

Não

  • compressionstrategy: Define a estratégia de compressão de armazenamento de dados. Os valores válidos são normal, high e extreme. enable_auto_substitute: Define se deve ativar o repasse de consulta para a tabela source particionada quando uma partição não existir. Para mais informações, consulte Materialized view query rewrite.

  • enable_auto_refresh: Opcional. Defina esta propriedade como true para ativar a atualização automática de dados.

  • refresh_interval_minutes: Este parâmetro é necessário apenas quando enable_auto_refresh estiver definido como true. Especifica o intervalo de atualização em minutos.

  • only_refresh_max_pt: Opcional. Esta propriedade aplica-se apenas a materialized views particionadas. Se definida como true, apenas a partição mais recente da tabela source será atualizada.

select_statement

Sim

Instrução SELECT que define a materialized view. Para mais informações, consulte SELECT Syntax.

Exemplos

Criar uma materialized view

  1. Crie tabelas chamadas mf_t e mf_t1 e insira dados nessas tabelas.

    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. Crie uma materialized view.

    • Exemplo 1: Crie uma materialized view contendo uma coluna de chave de partição chamada 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          |
      +------------+------------+------------+
    • Exemplo 2: Crie uma materialized view não particionada e clusterizada.

      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';
    • Exemplo 3: Crie uma materialized view particionada e clusterizada.

      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';

Implementar reescrita de consulta baseada em materialized view

  1. Cenário

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

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

    A estrutura de visit_records é a seguinte:

    +------------------------------------------------------------------------------------+
    | Field           | Type       | Label | Comment                                     |
    +------------------------------------------------------------------------------------+
    | page_id         | string     |       |                                             |
    | user_id         | string     |       |                                             |
    | visit_time      | string     |       |                                             |
    +------------------------------------------------------------------------------------+
  2. Crie uma materialized view.

    -- 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;

    Ao executar essa instrução de consulta, o MaxCompute associa automaticamente a materialized view count_mv e lê os dados pré-agregados de count_mv.

  4. Para verificar se a consulta foi reescrita usando a materialized view, execute o seguinte comando EXPLAIN:

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

    O resultado retornado é:

    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 campo Data source no resultado retornado mostra que a tabela lida pela consulta é a count_mv do projeto doc_test_dev. Isso indica que a materialized view está ativa e a reescrita de consulta foi bem-sucedida.

Executar uma operação de reescrita de consulta baseada em materialized view

O principal recurso das materialized views é a capacidade de reescrever instruções de consulta. Para reescrever consultas com base em uma materialized view, adicione set odps.sql.materialized.view.enable.auto.rewriting=true; antes da instrução de consulta. Se a materialized view estiver inválida, ela não poderá ser usada para reescrita de consulta. Nesse caso, os dados serão consultados diretamente na tabela source e a velocidade da consulta não será acelerada.

Nota

Por padrão, um projeto MaxCompute só pode usar suas próprias materialized views para operações de reescrita de consulta. Se você precisar realizar reescritas de consulta baseadas em materialized views de outros projetos MaxCompute, adicione set odps.sql.materialized.view.source.project.white.list=<project_name1>,<project_name2>,<project_name3>; antes das instruções de consulta para especificar os projetos MaxCompute desejados.

A tabela a seguir compara os tipos de operadores de reescrita de consulta 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

As operações de reescrita de consulta baseadas em materialized view exigem que os dados da instrução de consulta sejam obtidos da materialized view. Esses dados incluem colunas de saída, colunas necessárias para operações de filtro, colunas exigidas por funções de agregação e colunas usadas em operações de JOIN. Se as colunas necessárias na instrução de consulta não estiverem incluídas na materialized view ou não forem suportadas pelas funções de agregação, não será possível executar a reescrita de consulta baseada na materialized view.

Exemplo 1: Reescrita com condições de filtro

  1. Crie uma materialized view.

    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 materialized view.

    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 materialized view não contém a coluna d.

    SELECT d, e FROM src WHERE a=10;

    A reescrita falha porque a materialized view não contém as colunas d e e.

    SELECT a, b FROM src WHERE a=1;

    A reescrita falha porque a materialized view 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 materialized view e a consulta compartilharem a mesma chave de agregação. Se as chaves de agregação forem diferentes, apenas reescritas usando SUM, MIN e MAX serão suportadas.

  1. Crie uma materialized view.

    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 materialized view.

    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 view já agregou as colunas a e b, então a coluna b não pode ser agregada novamente.

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

    A reescrita falha porque a reagregação da função COUNT não é suportada.

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

  1. Crie uma materialized view.

    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 materialized view.

    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 a reagregação da função COUNT não é suportada.

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

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

Exemplo 3: Reescrita com cláusula JOIN

Reescrever entradas de JOIN

  1. Crie materialized views.

    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 materialized views.

    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 materialized views.

    --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 materialized views.

    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 materialized view não contém a coluna j2.a.

Estender um JOIN

  1. Crie uma materialized view.

    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 materialized view.

    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;

Esses três cenários de reescrita de JOIN podem ser combinados.

Como o objetivo da reescrita de consulta em materialized view é acelerar as consultas, o MaxCompute prioriza regras de reescrita que oferecem o melhor desempenho. Uma regra não será aplicada se introduzir operações que resultem em baixa aceleração.

Exemplo 4: Reescrita com cláusula LEFT JOIN

  1. Crie uma materialized view.

    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. A tabela a seguir mostra como uma consulta é reescrita com base na materialized view.

    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 cláusula UNION ALL

  1. Crie uma materialized view.

    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 materialized view.

    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;

Consulta transparente em materialized view

Uma materialized view particionada pode não conter dados de todas as partições — por exemplo, se você atualizar apenas as mais recentes. Quando uma consulta visa uma partição sem dados na materialized view, o sistema recorre automaticamente à tabela source particionada. A figura a seguir ilustra esse processo.

查询透穿图示

Para ativar o recurso de consulta transparente em uma materialized view, defina o seguinte parâmetro:

Ao criar a materialized view, adicione a configuração "enable_auto_substitute"="true" em tblproperties.

O exemplo a seguir demonstra como usar uma materialized view com suporte a consultas transparentes.

  1. Crie uma materialized view particionada com suporte a consultas 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. Consulte dados da partição 20210101 na materialized view mv.

    SELECT * FROM mv WHERE dt='20210101';
  3. Consulte dados da partição 20210102 na materialized view mv. O sistema executa automaticamente uma consulta transparente na tabela source porque essa partição não está materializada.

    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. Consulte dados de um intervalo de partições na materialized view mv. O sistema executa automaticamente uma consulta transparente na tabela source para os dados não materializados e os combina com os dados materializados usando uma operação UNION antes de retornar o resultado.

    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;

Instruções relacionadas