Todos os produtos
Search
Central de documentação

MaxCompute:CREATE MATERIALIZED VIEW

Última atualização: Jun 27, 2026

Cria uma materialized view com suporte opcional a particionamento, clustering e atualização agendada.

Informações básicas

Uma view é uma consulta armazenada executada nas tabelas source sempre que acessada. Já uma materialized view é uma tabela física que armazena resultados de consultas pré-computados. Ela ocupa armazenamento real, mas oferece desempenho de consulta superior ao eliminar operações repetidas de JOIN e agregação.

Consulta tradicional

Consulta com materialized view

Instruções de consulta

Consultas SQL são executadas nas tabelas source a cada acesso.

A consulta é executada na materialized view pré-computada. Se a reescrita de consulta estiver ativada, o MaxCompute redireciona automaticamente as consultas correspondentes para a materialized view, sem necessidade de alterações no código.

Características da consulta

Envolve varreduras de tabela, JOINs e filtros em cada execução. Lenta para grandes conjuntos de dados.

Envolve apenas varreduras de tabela e filtros. Os resultados dos JOINs já estão armazenados. O MaxCompute seleciona automaticamente a materialized view mais eficiente.

Quando usar uma materialized view

Materialized views são adequadas para os seguintes cenários de consulta:

  • Consultas executadas frequentemente e que seguem um padrão fixo.

  • Consultas que envolvem operações demoradas, como JOINs ou agregações.

  • Consultas que leem apenas uma pequena parte de uma tabela grande.

Se nenhuma dessas condições se aplicar — por exemplo, se o padrão de consulta mudar com frequência ou se o conjunto de dados for pequeno — uma view comum ou uma consulta direta pode ser mais apropriada.

Faturamento

As materialized views geram custos em duas categorias:

Armazenamento

Materialized views ocupam armazenamento físico. As cobranças são baseadas no espaço de armazenamento utilizado. Para detalhes sobre preços, consulte Preços de armazenamento (pagamento conforme o uso).Materialized views ocupam espaço de armazenamento físico. Você é cobrado pelo espaço de armazenamento físico ocupado pelas materialized views. Para obter mais informações sobre preços de armazenamento, consulte Preços de armazenamento (pagamento conforme o uso).

Computação

Custos de computação são aplicados quando você cria, atualiza ou consulta uma materialized view (incluindo operações de reescrita de consulta quando a view é válida).

  • Projetos por assinatura: Nenhum custo extra de computação é gerado.

  • Projetos com pagamento conforme o uso: As taxas são calculadas com base na complexidade do SQL e na quantidade de dados de entrada verificados. Para obter detalhes, consulte a seção "Faturamento para trabalhos SQL padrão" em Preços de computação.Preços de computação

Notas adicionais de faturamento para projetos com pagamento conforme o uso:

  • Atualizações: O SQL usado para atualizar uma materialized view é o mesmo usado para criá-la. Se o projeto estiver vinculado a um grupo de recursos por assinatura, não haverá taxas adicionais. Se estiver vinculado a um grupo de recursos com pagamento conforme o uso, as taxas variarão com base no volume de dados de entrada e na complexidade do SQL. Taxas de armazenamento são aplicadas após cada atualização, com base no espaço utilizado.

  • Reescrita de consulta (materialized view válida): Os dados de entrada são lidos da materialized view, não da tabela source. Os custos dependem do tamanho da materialized view.

  • Reescrita de consulta (materialized view inválida): A reescrita de consulta não pode ser realizada. Os dados são lidos da tabela source e os custos dependem do tamanho dessa tabela.

  • Inchaço de dados: Quando uma materialized view é construída a partir de múltiplas tabelas unidas por JOIN, o resultado armazenado pode ser maior que as tabelas source. O MaxCompute não garante que a leitura de uma materialized view custe menos do que a leitura das tabelas source.

Limitações

As limitações abaixo são vigentes. Algumas podem ser flexibilizadas ou removidas em versões futuras.

Funções não suportadas:

  • Funções de janela não são suportadas.

  • Funções com valor de tabela definidas pelo usuário (UDTFs) não são suportadas.

  • Funções não determinísticas — incluindo funções definidas pelo usuário (UDFs) e funções de agregação definidas pelo usuário (UDAFs) — não são suportadas por padrão. Para ativá-las, execute o comando a seguir antes de executar sua consulta:

    set odps.sql.materialized.view.support.nondeterministic.function=true;

Notas de uso:

  • Se a instrução de consulta usada para definir a materialized view falhar na execução, a materialized view não poderá ser criada.

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

  • Comentários são obrigatórios para todas as colunas, incluindo as colunas de chave de partição. Especificar comentários apenas para algumas colunas resulta em erro.

  • É possível especificar atributos de particionamento e clustering para a mesma materialized view. Nesse caso, cada partição terá o atributo de clustering especificado aplicado.

  • Se a instrução de consulta referenciar operadores não suportados para reescrita de consulta, um erro será retornado durante a criação da materialized view. Para operadores suportados, consulte Reescrita de consulta.

  • Se uma tabela source contiver uma partição vazia, a atualização da materialized view gerará uma partição vazia correspondente na materialized view.

Sintaxe

CREATE MATERIALIZED VIEW [IF NOT EXISTS] [project_name.]<mv_name>
[LIFECYCLE <days>]                          -- Lifecycle of the materialized view, in days.
[BUILD DEFERRED]                            -- Create schema only; do not populate data.
[(<col_name> [COMMENT <col_comment>], ...)] -- Column comments.
[DISABLE REWRITE]                           -- Disable query rewrite for this materialized view.
[COMMENT 'table_comment']                   -- Comment for the materialized view.
[PARTITIONED BY (<col_name> [, <col_name>, ...])]
[CLUSTERED BY | RANGE CLUSTERED BY (<col_name> [, <col_name>, ...])
    [SORTED BY (<col_name> [ASC | DESC] [, <col_name> [ASC | DESC] ...])]
    INTO <number_of_buckets> BUCKETS]
[REFRESH EVERY <num> MINUTES | HOURS | DAYS]
[TBLPROPERTIES (
    "compressionstrategy" = "normal | high | extreme",
    "enable_auto_substitute" = "true",      -- Fall through to source table when partition is missing.
    "enable_auto_refresh" = "true",         -- Enable scheduled refresh.
    "refresh_interval_minutes" = "120",     -- Refresh interval in minutes.
    "only_refresh_max_pt" = "true"          -- Refresh only the latest partition from the source table.
)]
AS <select_statement>;

Parâmetros

Parâmetro

Obrigatório

Descrição

IF NOT EXISTS

Não

Ignora a criação se a materialized view já existir. Sem esta cláusula, um erro é retornado caso a view já exista.

project_name

Não

Projeto do MaxCompute que possui a materialized view. O padrão é o projeto atual. Para encontrar o nome do projeto, faça logon no MaxCompute console, selecione uma região e verifique a página Projects.

mv_name

Sim

Nome da materialized view a ser criada.

days

Não

Ciclo de vida da materialized view. Unidade: dias. Valores válidos: 1–37231.

BUILD DEFERRED

Não

Cria apenas o esquema. Os dados não são populados no momento da criação.

col_name

Não

Nome da coluna na materialized view.

col_comment

Não

Comentário para a coluna.

DISABLE REWRITE

Não

Desativa a reescrita de consulta para esta materialized view. A reescrita de consulta é ativada por padrão. Para alterar isso após a criação, use ALTER MATERIALIZED VIEW [project_name.]<mv_name> DISABLE REWRITE ou ENABLE REWRITE.

PARTITIONED BY

Não

Colunas de chave de partição para a materialized view. Obrigatório ao criar uma materialized view particionada.

`CLUSTERED BY

RANGE CLUSTERED BY`

Não

Atributo de shuffle da materialized view. Obrigatório ao criar uma materialized view com clustering.

SORTED BY

Não

Atributo de ordenação dentro de cada bucket. Obrigatório ao criar uma materialized view com clustering.

REFRESH EVERY

Não

Intervalo de atualização agendada. Unidades: MINUTES, HOURS ou DAYS.

number_of_buckets

Não

Número de buckets. Obrigatório ao criar uma materialized view com clustering.

select_statement

Sim

Instrução SELECT que define a materialized view. Para detalhes de sintaxe, consulte Sintaxe SELECT.

Subparâmetros TBLPROPERTIES:

Subparâmetro

Obrigatório

Valores

Descrição

compressionstrategy

Não

normal, high, extreme

Política de compressão para dados armazenados.

enable_auto_substitute

Não

true

false

Quando definido como true, consulta a tabela source para partições não presentes na materialized view. Para detalhes, consulte Consulta e reescrita para a materialized view.

enable_auto_refresh

Não

true

false

Quando definido como true, o sistema atualiza os dados automaticamente conforme agendamento.

refresh_interval_minutes

Condicional

Inteiro

Obrigatório quando enable_auto_refresh é true. Intervalo de atualização em minutos.

only_refresh_max_pt

Não

true

false

Válido para materialized views particionadas. Quando definido como true, apenas a partição mais recente da tabela source é atualizada na materialized view.

Exemplos

Criar uma materialized view

Os exemplos a seguir utilizam duas tabelas source particionadas: mf_t e mf_t1.

Etapa 1: Crie as tabelas source e insira dados.

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';
-- Result:
-- +------------+------------+------------+------------+
-- | 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';
-- Result:
-- +------------+------------+------------+------------+
-- | id         | value      | name       | ds         |
-- +------------+------------+------------+------------+
-- | 1          | 10         | kyle       | 1          |
-- | 3          | 20         | john       | 1          |
-- +------------+------------+------------+------------+

Etapa 2: Crie uma materialized view. Os exemplos a seguir mostram três configurações comuns.

Exemplo 1: Materialized view particionada

Cria uma materialized view com uma coluna de chave de partição ds, ciclo de vida de 7 dias e comentários nas colunas.

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;
-- Result:
-- +------------+------------+------------+
-- | key        | value      | ds         |
-- +------------+------------+------------+
-- | 1          | 10         | 1          |
-- +------------+------------+------------+

Exemplo 2: Materialized view não particionada com clustering

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: Materialized view particionada e com clustering

Combina particionamento e clustering. Os dados dentro de cada partição são distribuídos em buckets.

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

Usar reescrita de consulta para acelerar consultas

Este exemplo usa uma tabela de acesso a páginas visit_records que registra page_id, user_id e visit_time. Consultas de análise de tráfego que contam visitas por página são executadas frequentemente.

Etapa 1: Crie uma materialized view que pré-compute as contagens de visitas por página.

CREATE MATERIALIZED VIEW count_mv
AS SELECT page_id, count(*) FROM visit_records GROUP BY page_id;

Etapa 2: Ative a reescrita de consulta e execute a consulta original.

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

O MaxCompute corresponde automaticamente a consulta à count_mv e lê os resultados agregados dela, em vez de verificar visit_records.

Etapa 3: Verifique se a consulta foi reescrita usando EXPLAIN.

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

Saída esperada:

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 confirma que a consulta lê dados de count_mv no projeto doc_test_dev, e não da tabela original visit_records.

Configurar estratégias de atualização

Os três exemplos abaixo demonstram diferentes maneiras de manter uma materialized view atualizada.

Apenas atualização manual (padrão)

Nenhuma cláusula de atualização é especificada. Atualize a view explicitamente usando ALTER MATERIALIZED VIEW.

CREATE MATERIALIZED VIEW sales_mv
AS SELECT region, sum(amount) AS total FROM sales GROUP BY region;

Atualização agendada usando REFRESH EVERY

Atualiza a view automaticamente a cada 2 horas.

CREATE MATERIALIZED VIEW sales_mv
REFRESH EVERY 2 HOURS
AS SELECT region, sum(amount) AS total FROM sales GROUP BY region;

Atualização agendada usando TBLPROPERTIES

Define um intervalo de atualização de 120 minutos e atualiza automaticamente apenas a partição mais recente da tabela source.

CREATE MATERIALIZED VIEW sales_mv LIFECYCLE 7
PARTITIONED BY (ds)
TBLPROPERTIES (
    "enable_auto_refresh"      = "true",
    "refresh_interval_minutes" = "120",
    "only_refresh_max_pt"      = "true"
)
AS SELECT region, ds, sum(amount) AS total FROM sales GROUP BY region, ds;

Reescrita de consulta

A reescrita de consulta redireciona automaticamente as consultas para uma materialized view correspondente, eliminando computação redundante nas tabelas source. Para ativar a reescrita de consulta, adicione o seguinte comando antes da sua consulta:

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

Se a materialized view for inválida, a reescrita de consulta não poderá ser realizada e o MaxCompute voltará a consultar a tabela source.

Por padrão, um projeto só pode usar suas próprias materialized views para reescrita de consulta. Para permitir a reescrita de consulta usando materialized views de outros projetos, adicione o seguinte comando e especifique os projetos permitidos:
SET odps.sql.materialized.view.source.project.white.list=<project_name1>,<project_name2>,<project_name3>;

Operadores suportados para reescrita de consulta

Tipo de operador

Classificação

MaxCompute

BigQuery

Amazon Redshift

Hive

FILTER

Correspondência total de expressão

Suportado

Suportado

Suportado

Suportado

FILTER

Correspondência parcial de expressão

Suportado

Suportado

Suportado

Suportado

AGGREGATE

Agregação única

Suportado

Suportado

Suportado

Suportado

AGGREGATE

Múltiplas agregações

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

JOIN único

Suportado

Não suportado

Suportado

Suportado

JOIN

Múltiplos JOINs

Suportado

Não suportado

Suportado

Suportado

AGGREGATE + JOIN

Suportado

Não suportado

Suportado

Suportado

Para que a reescrita de consulta tenha êxito, todas as colunas necessárias pela consulta — colunas de saída, colunas de filtro, colunas de função de agregação e colunas de JOIN — devem estar presentes na materialized view.

Reescrever consultas com condições de filtro

Todos os exemplos nesta seção usam a seguinte materialized view:

CREATE MATERIALIZED VIEW mv AS SELECT a, b, c FROM src WHERE a > 5;

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;

Falha na reescrita — mv não possui a coluna d.

SELECT d, e FROM src WHERE a = 10;

Falha na reescrita — mv não possui as colunas d e e.

SELECT a, b FROM src WHERE a = 1;

Falha na reescrita — mv não possui dados onde a = 1.

Reescrever consultas com funções de agregação

Quando as chaves de agregação correspondem à materialized view, a reescrita é suportada para todas as funções de agregação. Quando as chaves de agregação diferem, apenas SUM, MIN e MAX são suportadas.

Todos os exemplos usam:

CREATE MATERIALIZED VIEW mv AS
SELECT a, b, sum(c) AS sum, count(d) AS cnt FROM src GROUP BY a, b;

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;

Falha na reescrita — mv já agregou a e b; b não pode ser agregado novamente.

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

Falha na reescrita — re-agregação de COUNT não é suportada.

Quando DISTINCT é usado, a reescrita é suportada apenas quando as chaves de agregação correspondem exatamente à materialized view.

Todos os exemplos usam:

CREATE MATERIALIZED VIEW mv AS
SELECT a, b, sum(DISTINCT c) AS sum, count(DISTINCT d) AS cnt FROM src GROUP BY a, b;

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;

Falha na reescrita — re-agregação de COUNT não é suportada.

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

Falha na reescrita — agregação adicional em a é necessária.

Reescrever consultas com JOIN

Reescrever entradas de JOIN

Quando as entradas de JOIN de uma consulta correspondem à definição de uma materialized view, o MaxCompute substitui essas entradas pela materialized view.

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;

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

Crie materialized views:

-- Non-partitioned
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;
-- Partitioned
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;

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;

Falha na reescrita — mv não possui a coluna j2.a.

JOIN com tabelas adicionais

Crie a materialized view:

CREATE MATERIALIZED VIEW mv AS SELECT j1.a, j1.b FROM j1 JOIN j2 ON j1.a = j2.a;

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;

Os três tipos de reescrita de JOIN podem ser combinados. Se uma consulta atender às condições para múltiplas regras de reescrita, o MaxCompute selecionará o plano de execução mais eficiente. Se o plano reescrito não superar o original, a reescrita não será aplicada.

Reescrever consultas com LEFT JOIN

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

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;

Reescrever consultas com UNION ALL

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

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 de penetração

Quando uma materialized view particionada não contém todas as partições de sua tabela source — por exemplo, quando apenas a partição mais recente é atualizada — as consultas por partições ausentes consultam a tabela source automaticamente. Isso é chamado de consulta de penetração.

查询透穿图示

Para ativar consultas de penetração, defina "enable_auto_substitute"="true" em TBLPROPERTIES ao criar a materialized view.

O exemplo a seguir demonstra como funcionam as consultas de penetração.

Etapa 1: Crie uma materialized view particionada com consulta de penetração ativada.

-- Create source table.
CREATE TABLE src (id bigint, name string) PARTITIONED BY (dt string);

-- Insert data into two partitions.
INSERT INTO src PARTITION(dt='20210101') VALUES (1, 'Alex');
INSERT INTO src PARTITION(dt='20210102') VALUES (2, 'Flink');

-- Create a partitioned materialized view with penetration query enabled.
CREATE MATERIALIZED VIEW IF NOT EXISTS mv LIFECYCLE 7
PARTITIONED BY (dt)
TBLPROPERTIES ("enable_auto_substitute" = "true")
AS SELECT id, name, dt FROM src;

Etapa 2: Consulte a partição 20210101. Esta partição existe em mv, portanto os dados são lidos da materialized view.

SELECT * FROM mv WHERE dt = '20210101';

Etapa 3: Consulte a partição 20210102. Esta partição não existe em mv, então uma consulta de penetração recupera os dados de src.

SELECT * FROM mv WHERE dt = '20210102';
-- Equivalent to:
SELECT * FROM (SELECT id, name, dt FROM src WHERE dt = '20210102') t;

Etapa 4: Consulte um intervalo de partições abrangendo dados disponíveis e ausentes. O MaxCompute realiza uma consulta de penetração para as partições ausentes e combina os resultados usando UNION ALL.

SELECT * FROM mv WHERE dt >= '20201230' AND dt <= '20210102' AND id = '5';
-- Equivalent to:
SELECT * FROM (
    SELECT id, name, dt FROM src WHERE dt = '20211231' OR dt = '20210102'
    UNION ALL
    SELECT * FROM mv WHERE dt = '20210101'
) t WHERE id = '5';

Próximos passos