Todos os produtos
Search
Central de documentação

MaxCompute:Delta Live MV

Última atualização: Aug 21, 2026

Uma Delta Live Materialized View (Delta Live MV) permite criar pipelines simples de atualização incremental. Este tópico descreve como usar Delta Live MVs no MaxCompute.

Visão geral

Diferentemente de uma materialized view que exige atualização completa, a Delta Live MV equilibra a atualidade dos dados e o custo de computação. Ela reutiliza inteligentemente resultados de computação existentes e aplica algoritmos incrementais para reduzir custos e melhorar a atualidade dos dados.

Arquitetura

image

Principais vantagens

As Delta Live MVs do MaxCompute oferecem as seguintes vantagens:

  • Permite o uso de camadas no data warehouse com processos declarativos, totalmente gerenciados e automatizados.

  • Arquitetura simplificada de data warehouse: um único conjunto de lógica de computação e um mecanismo suportam tanto a computação incremental quanto a completa, atendendo às demandas de baixa latência e alto throughput.

  • Custo-benefício: equilibra a atualidade dos dados e o custo de computação, além de processar eficientemente operações incrementais e completas de forma unificada.

Casos de uso

O recurso Delta Live MV é adequado para os seguintes casos de uso:

  • Data warehouse quase em tempo real

    Possibilita a evolução de um data warehouse T+1 para um data warehouse quase em tempo real com latência de minutos.

  • Processamento unificado incremental e completo

    • Computação incremental quase em tempo real na partição do dia atual para garantir alta atualidade dos dados e custo-benefício.

    • (Opcional) Preenchimento retroativo de partições históricas para arquivamento, correção e análise de dados em larga escala.

  • Suporte abrangente à computação incremental com várias construções SQL, incluindo os seguintes operadores comuns:

    • INNER JOIN de dois fluxos

    • LEFT/RIGHT OUTER JOIN de dois fluxos

    • Todas as funções AGGREGATE (exceto UDAFs), incluindo aquelas sem GROUP BY ou AGG.

    • WINDOW

    • TableFunctionScan

    • UNION ALL

    • FILTER/Project

    • SUBQUERY

Pré-requisitos

  • Tenha um projeto do MaxCompute.

  • A tabela de origem deve ter o Change Data Capture (CDC) ativado. Os seguintes tipos de tabela de origem são suportados:

    • Uma Delta Table com o recurso CDC explicitamente ativado.

    • Outra Delta Live MV. O CDC é ativado por padrão para Delta Live MVs.

  • Uma Delta Live MV não pode conter computações não determinísticas, como a função RAND ou UDFs.

Criar uma Delta Live MV

Sintaxe

CREATE MATERIALIZED VIEW [IF NOT EXISTS][<project_name>.]<mv_name>
[LIFECYCLE <days>]    --Specify the lifecycle.
[BUILD DEFERRED]    --Create only the table schema without populating data.
[(<col_name> [COMMENT <col_comment>],...)]    --Column comment.
[DISABLE REWRITE]    --Disables query rewrite for this view.
[COMMENT <table comment>]    --Table comment.
[PARTITIONED ON/BY (<col_name> [, <col_name>, ...])    --Create the materialized view as a partitioned table.
[REFRESH EVERY <num> MINUTES/HOURS/DAYS] --Set the scheduled refresh interval for the materialized view.
TBLPROPERTIES(
  "refresh_mode"="incremental"
  [,"enable_auto_refresh"="true"]    --Specify whether to enable auto-refresh.
  [,"refresh_cron"="xx"]             --Configure scheduled interval, point-in-time, or combined refreshes by using a cron expression.
  [,"refresh_job_settings"="xx"]
              )
AS <select_statement>;

A sintaxe da Delta Live MV é compatível com a da materialized view padrão, com as seguintes diferenças:

  • Não é possível criar uma Delta Live MV como tabela clusterizada.

  • O parâmetro enable_auto_substitute não pode ser definido como true para uma Delta Live MV. Como a Delta Live MV é uma materialized view assíncrona, os dados da tabela base podem não estar na versão mais recente. Isso entra em conflito com o comportamento quando enable_auto_substitute é definido como true.

Parâmetros

Parâmetro

Obrigatório

Descrição

project_name

Não

Nome do projeto.

mv_name

Sim

Nome da Delta Live MV.

LIFECYCLE <days>

Não

Ciclo de vida dos dados em dias.

BUILD DEFERRED

Não

Cria o esquema da tabela sem gerar dados.

col_name

Não

Nome da coluna.

col_comment

Não

Comentário da coluna.

DISABLE REWRITE

Não

Desativa a reescrita de consulta para a view.

table comment

Não

Comentário da tabela.

REFRESH EVERY <num> MINUTES/HOURS/DAYS

Não

Especifica o intervalo de atualização agendada. O valor mínimo é 1 minuto.

enable_auto_refresh

Não

Define se a atualização automática deve ser ativada.

  • true: Ativa a atualização automática.

  • false: Desativa a atualização automática.

refresh_mode

Não

Modo de atualização.

  • full: atualização completa.

  • incremental: atualização incremental.

refresh_cron

Não

Expressão Cron QUARTZ para definir a frequência de atualização. É possível configurar agendamentos baseados em intervalo, ponto no tempo ou uma combinação de ambos.

O valor é uma string no formato Cron QUARTZ. Para obter mais informações, consulte Exemplos de expressão Cron. Veja um exemplo abaixo:

TBLPROPERTIES(
  "enable_auto_refresh"="true",
  "refresh_cron"="xx"
)

refresh_job_settings

Não

  • Define parâmetros gerais de ajuste aplicados automaticamente durante uma atualização. Exemplo:

    'refresh_job_settings'='set odps.sql.split.size=128;set odps.sql.reshuffle.dynamicpt
    =false;'
  • Os sinalizadores definidos com este parâmetro têm prioridade maior do que os sinalizadores da sessão atual.

select_statement

Sim

Instrução de consulta SQL.

Exemplos

Exemplo 1: Criar uma Delta Live MV simples

Defina uma Delta Live MV chamada mv1 que execute uma atualização incremental automaticamente a cada 5 minutos. A tabela de origem é uma Delta Table com CDC ativado.

CREATE MATERIALIZED VIEW IF NOT EXISTS mv1
REFRESH EVERY 5 MINUTES
TBLPROPERTIES("enable_auto_refresh"="true", "refresh_mode"="incremental")
AS 
SELECT name, COUNT(*) FROM source GROUP BY name;

Exemplo 2: Criar uma view com parâmetros de ajuste

SET odps.task.major.version=sql_flighting_dlmv;

CREATE MATERIALIZED VIEW IF NOT EXISTS part_dlmv_department
PRIMARY KEY(dept_id) -- The primary key can be inferred from the SQL logic. However, because partitioned MVs only support BUILD DEFERRED mode, which requires an explicitly declared primary key, you must declare it here.
LIFECYCLE 10
BUILD DEFERRED
PARTITIONED BY (pt)
TBLPROPERTIES('refresh_mode'='incremental', 
  'refresh_job_settings'='set odps.task.major.version=sql_flighting_dlmv;')
AS 
SELECT *, get_setting('odps.custom.setting.department.pt') AS pt FROM t_department; 

Requisitos de chave primária para atualização de MV:

Para oferecer suporte a atualizações, uma Delta Live MV deve ter uma chave primária (PK). A necessidade de declarar explicitamente uma PK depende da situação:

  • Quando a chave primária pode ser inferida automaticamente pela lógica SQL

    Por exemplo, se o SQL contiver uma chave GROUP BY, a chave primária da MV será inferida automaticamente como key, sem necessidade de declaração explícita. Visualize a coluna de chave primária inferida executando o comando DESC EXTENDED mvName;.

  • Quando a chave primária não pode ser inferida automaticamente pela lógica SQL

    • Método 1: Modifique a lógica SQL da MV adicionando uma cláusula GROUP BY para atender à condição de inferência automática.

    • Método 2: Declare explicitamente a chave primária. Os próprios dados devem satisfazer a restrição de unicidade. O sistema tenta verificar a unicidade dos dados em cada atualização incremental. A verificação de unicidade para o carregamento inicial de dados está sendo otimizada e estará disponível em uma versão futura.

  • Requisitos especiais para MVs particionadas

    Atualmente, uma MV particionada suporta apenas o modo BUILD DEFERRED, que não oferece suporte à inferência automática de chave primária. Portanto, declare a chave primária explicitamente.

Delta Live MV particionada

Cenário 1: Usar uma Delta Live MV particionada para representar dados incrementais do dia atual e dados completos para registros históricos.

SET odps.task.major.version=sql_flighting_dlmv;

CREATE MATERIALIZED VIEW IF NOT EXISTS part_dlmv_department
PRIMARY KEY(dept_id) -- The primary key can be inferred from the SQL logic. However, because partitioned MVs only support BUILD DEFERRED mode, which requires an explicitly declared primary key, you must declare it here.
LIFECYCLE 10
BUILD DEFERRED
PARTITIONED BY (pt)
TBLPROPERTIES('refresh_mode'='incremental', 
  'refresh_job_settings'='set odps.task.major.version=sql_flighting_dlmv;')
AS 
-- t_department is a near-real-time ingestion table that mainly contains incremental data for the current day.
SELECT *, get_setting('odps.custom.setting.department.pt') AS pt FROM t_department; 
UNION ALL
-- history_t_department is a historical partitioned table containing all historical data.
SELECT * FROM history_t_department;

Cenário 2: Usar group by key para derivar a coluna PK de uma dlmv.

// pk delta table
CREATE TABLE dlmv_base_table(
    key    STRING NOT NULL PRIMARY KEY,
    value  BIGINT,
    value2 BIGINT
)
STORED AS ALIORC
TBLPROPERTIES (
    'transactional'                    = 'true',
    'cdc.insert.into.passthrough.enable' = 'true',
    'acid.cdc.mode.enable'             = 'true',
    'acid.cdc.build.async'             = 'false'
);

CREATE MATERIALIZED VIEW dlmv_pt
PRIMARY KEY(value) -- The primary key can be inferred from the SQL logic. However, because partitioned MVs only support BUILD DEFERRED mode, which requires an explicitly declared primary key, you must declare it here.
build deferred 
partitioned BY (pt)
TBLPROPERTIES (
    'refresh_mode'        = 'incremental',
    'enable_auto_refresh' = 'true'
)
AS SELECT *, get_setting('odps.custom.setting.dlmv_pt.pt') AS pt FROM (SELECT value, MAX(value2)  FROM dlmv_base_table GROUP BY value) t;

Cenário 3: Inferir a coluna de chave primária da Delta Live MV a partir da chave primária da tabela base.

// pk delta table
CREATE TABLE dlmv_base_table(
    key    STRING NOT NULL PRIMARY KEY,
    value  BIGINT,
    value2 BIGINT
)
STORED AS ALIORC
TBLPROPERTIES (
    'transactional'                    = 'true',
    'cdc.insert.into.passthrough.enable' = 'true',
    'acid.cdc.mode.enable'             = 'true',
    'acid.cdc.build.async'             = 'false'
);

CREATE MATERIALIZED VIEW dlmv_pt
PRIMARY KEY(key) --The primary key can be inferred from the SQL logic. However, because partitioned MVs only support BUILD DEFERRED mode, which requires an explicitly declared primary key, you must declare it here.
build deferred 
partitioned BY (pt)
TBLPROPERTIES (
    'refresh_mode'        = 'incremental',
    'enable_auto_refresh' = 'true'
)
AS
SELECT key, value, value2, get_setting('odps.custom.setting.dlmv_pt.pt') as pt FROM dlmv_base_table;

Cenário 4: A coluna de chave primária da Delta Live MV não pode ser inferida.

// pk delta table
CREATE TABLE dlmv_base_table(
    key    STRING NOT NULL PRIMARY KEY,
    value  BIGINT,
    value2 BIGINT
)
STORED AS ALIORC
TBLPROPERTIES (
    'transactional'                    = 'true',
    'cdc.insert.into.passthrough.enable' = 'true',
    'acid.cdc.mode.enable'             = 'true',
    'acid.cdc.build.async'             = 'false'
);

# 1. Explicitly declare the primary key column
CREATE MATERIALIZED VIEW dlmv_pt
primary key(value) -- The primary key column cannot be inferred as 'value' from the SQL logic, but the user knows the data itself satisfies the primary key uniqueness. The primary key must be explicitly declared.
build deferred 
partitioned BY (pt)
TBLPROPERTIES (
    'refresh_mode'        = 'incremental',
    'enable_auto_refresh' = 'true'
)
AS
SELECT value, value2, get_setting('odps.custom.setting.dlmv_pt.pt') as pt FROM dlmv_base_table;

# 2. Modify the SQL logic to allow primary key inference.
-- If the uniqueness of the 'value' column cannot be guaranteed, the logic can be modified with a group by clause, as shown below:
CREATE MATERIALIZED VIEW dlmv_pt
primary key(value) -- The primary key can be inferred from the SQL logic. However, because partitioned MVs only support BUILD DEFERRED mode, which requires an explicitly declared primary key, you must declare it here.
build deferred 
partitioned BY (pt)
TBLPROPERTIES (
    'refresh_mode'        = 'incremental',
    'enable_auto_refresh' = 'true'
)
AS SELECT value, MAX(value2), get_setting('odps.custom.setting.dlmv_pt.pt') as pt FROM dlmv_base_table GROUP BY value;

Delta Live MV não particionada

Cenário 1: Ao usar group by key, é possível derivar a coluna PK da DLMV.

// pk delta table
CREATE TABLE dlmv_base_table(
    key    STRING NOT NULL PRIMARY KEY,
    value  BIGINT,
    value2 BIGINT
)
STORED AS ALIORC
TBLPROPERTIES (
    'transactional'                    = 'true',
    'cdc.insert.into.passthrough.enable' = 'true',
    'acid.cdc.mode.enable'             = 'true',
    'acid.cdc.build.async'             = 'false'
);

CREATE MATERIALIZED VIEW dlmv
-- primary key(value) can be inferred from the SQL logic (group by value), so explicit declaration is not needed.
TBLPROPERTIES (
    'refresh_mode'        = 'incremental',
    'enable_auto_refresh' = 'true'
)
AS SELECT value, MAX(value2) FROM dlmv_base_table GROUP BY value;

Cenário 2: Inferir a coluna de chave primária da Delta Live MV a partir da chave primária da tabela base.

// pk delta table
CREATE TABLE dlmv_base_table(
    key    STRING NOT NULL PRIMARY KEY,
    value  BIGINT,
    value2 BIGINT
)
STORED AS ALIORC
TBLPROPERTIES (
    'transactional'                    = 'true',
    'cdc.insert.into.passthrough.enable' = 'true',
    'acid.cdc.mode.enable'             = 'true',
    'acid.cdc.build.async'             = 'false'
);

CREATE MATERIALIZED VIEW dlmv
-- primary key(key) can be inferred from the SQL logic (derived from the base table's primary key), so explicit declaration is not needed.
TBLPROPERTIES (
    'refresh_mode'        = 'incremental',
    'enable_auto_refresh' = 'true'
)
AS
SELECT key, value, value2 FROM dlmv_base_table;

Cenário 3: A coluna de chave primária da Delta Live MV não pode ser inferida.

// pk delta table
CREATE TABLE dlmv_base_table(
    key    STRING NOT NULL PRIMARY KEY,
    value  BIGINT,
    value2 BIGINT
)
STORED AS ALIORC
TBLPROPERTIES (
    'transactional'                    = 'true',
    'cdc.insert.into.passthrough.enable' = 'true',
    'acid.cdc.mode.enable'             = 'true',
    'acid.cdc.build.async'             = 'false'
);

# 1. Explicitly declare the primary key column
CREATE MATERIALIZED VIEW dlmv
primary key(value) -- The primary key column cannot be inferred as 'value' from the SQL logic, but the user knows the data itself satisfies the primary key uniqueness. The primary key must be explicitly declared.
TBLPROPERTIES (
    'refresh_mode'        = 'incremental',
    'enable_auto_refresh' = 'true'
)
AS
SELECT value, value2 FROM dlmv_base_table;

# 2. Modify the SQL logic to allow primary key inference
-- If the uniqueness of the 'value' column cannot be guaranteed, the logic can be modified with a group by clause, as shown below:
CREATE MATERIALIZED VIEW dlmv
-- primary key(value) can be inferred from the SQL logic (group by value), so explicit declaration is not needed.
TBLPROPERTIES (
    'refresh_mode'        = 'incremental',
    'enable_auto_refresh' = 'true'
)
AS SELECT value, MAX(value2) FROM dlmv_base_table GROUP BY value;

Exemplo 3: Atualizar uma única partição

Ao criar uma Delta Live MV particionada, adicione a palavra-chave BUILD DEFERRED para indicar que apenas operações DDL serão executadas.

-- Create the Delta Live MV.
CREATE MATERIALIZED VIEW dlmv_pt
PRIMARY KEY(value) BUILD DEFERRED PARTITIONED BY (ds) TBLPROPERTIES
('refresh_mode'='incremental', 'enable_auto_refresh'='true') 
AS SELECT value, AVG(value2), ds FROM dlmv_pt_src GROUP BY value, ds;

-- Refresh a single partition.
ALTER MATERIALIZED VIEW dlmv_pt REBUILD PARTITION(ds='20250730');
Nota

Para obter mais informações sobre como atualizar uma Delta Live MV, consulte Atualizar manualmente uma Delta Live MV.

Exemplo 4: Usar definições parametrizadas

O uso de definições parametrizadas ajuda a migrar trabalhos particionados offline para trabalhos incrementais.

  • A função get_setting obtém os valores de parâmetros definidos no sinalizador da sessão. Os parâmetros devem ter o prefixo dps.custom.setting.

  • Substitua ${biz_date} em trabalhos offline tradicionais por get_setting(odps.custom.setting.xx) para concluir a parametrização.

  • Adicione o sinalizador de sessão set odps.custom.setting.xx=yy antes da instrução de atualização da Delta Live MV.

  • Em tempo de execução, o otimizador do MaxCompute substitui automaticamente get_setting(odps.custom.setting.xx) em uma Delta Live MV por yy.

Exemplo:

-- Create the Delta Live MV.
CREATE MATERIALIZED VIEW mv1 
BUILD DEFERRED -- DDL only; no data is generated.
PARTITIONED BY (ds) 
REFRESH EVERY 5 minutes 
TBLPROPERTIES("enable_auto_refresh"="true", "refresh_mode"="incremental")
AS 
SELECT A.* FROM A JOIN B ON A.c1 = B.c1
  AND A.ds=get_setting('odps.custom.setting.bizdate.a')
  AND B.ds=get_setting('odps.custom.setting.bizdate.b');

-- Refresh logic: DataWorks scheduling automatically replaces ${biz_date} and ${yesterday}.
SET odps.custom.setting.bizdate.a=${biz_date};
SET odps.custom.setting.bizdate.b=${yesterday};
ALTER MATERIALIZED VIEW mv1 REBUILD PARTITION(ds=${biz_date});

Gerenciar uma Delta Live MV

Excluir uma Delta Live MV

DROP MATERIALIZED VIEW [IF EXISTS] [<project_name>.]<mv_name>;

Atualização manual

É possível atualizar uma Delta Live MV manualmente. As atualizações manuais suportam apenas partições únicas.

ALTER MATERIALIZED VIEW [<project_name>.]<mv_name>
      REBUILD [PARTITION(<ds>=max_pt(<table_name>),<expression1>...)];

Nesta sintaxe, ds é a coluna de partição.

Desativar a atualização automática

Para desativar o recurso de atualização automática, execute o seguinte comando:

ALTER MATERIALIZED VIEW <mv_name> SET TBLPROPERTIES("enable_auto_refresh"="false");

Retomar a atualização automática

Execute o comando a seguir para modificar o TBLPROPERTIES da materialized view e ativar ou retomar a atualização automática.

ALTER MATERIALIZED VIEW <mv_name> SET TBLPROPERTIES("enable_auto_refresh"="true");

Alterar a frequência de atualização

Execute o comando a seguir para alterar a frequência de atualização de uma Delta Live MV.

ALTER MATERIALIZED VIEW <mv_name> 
SET TBLPROPERTIES("refresh_interval_minutes"="xx");
Nota

O valor mínimo para o parâmetro refresh_interval_minutes é 1. Recomendamos definir esse valor como inferior ao ciclo de vida do CDC da tabela base.

Visualizar uma Delta Live MV

Visualizar histórico de alterações de dados

Execute o comando a seguir para visualizar os registros de alteração de dados de uma Delta Live MV.

SHOW HISTORY FOR TABLE <mv_name>;

Resultado de exemplo:

ObjectType      ObjectId                                ObjectName              VERSION(LSN)            Time                    Operation
TABLE           d95ec7015e8b432e8e0092d01da962a9        incremental_mv          0000000000000001        2024-08-18 21:06:32     CREATE
TABLE           d95ec7015e8b432e8e0092d01da962a9        incremental_mv          0000000000000002        2024-08-18 21:11:13     UPDATE

Visualizar histórico de atualizações

Execute o comando a seguir para visualizar o histórico de atualizações de uma Delta Live MV.

SELECT * FROM 
Delta_Live_MV_Refresh_History(['<project_name>', '<schema_name>',]'<table_name>');

Parâmetros

Parâmetro

Descrição

project_name

Nome do projeto.

schema_name

Nome do esquema.

table_name

Nome da tabela.

Valores de retorno

Campo

Descrição

project_name

Projeto que contém a Delta Live MV.

schema_name

Esquema que contém a Delta Live MV.

name

Nome da Delta Live MV.

refresh_start_time

Hora de início da atualização.

refresh_end_time

Hora de término da atualização. Se o state do trabalho for RUNNING, este campo será NULL.

instance_id

ID do trabalho. Use este ID para abrir o Logview.

duration_in_seconds

Duração da atualização.

state

Estado do trabalho.

  • RUNNING

  • TERMINATED

  • FAILED

  • CANCELLED

refresh_trigger

Método de atualização.

  • MANUAL: A atualização foi acionada manualmente por um usuário ou agendada via DataWorks.

  • SYSTEM_SCHEDULED: A atualização é acionada pelo agendador interno do MaxCompute.

refresh_mode

Modo de atualização.

  • FULL

  • INCREMENTAL

  • NO_DATA

error_message

Informações sobre falha na atualização. Se a atualização for bem-sucedida, este valor será NULL.

source_tables

Nomes e versões das tabelas base usadas na atualização.

numInsertedRows

Número de linhas inseridas.

numDeletedRows

Número de linhas excluídas.

Faturamento

As Delta Live MVs geram taxas de computação e armazenamento. O método de faturamento é o mesmo utilizado para operações de materialized view regulares.

  • Taxas de computação

    • Ao criar ou atualizar uma Delta Live MV, se um trabalho for iniciado para computar dados, ele consumirá recursos de computação e gerará taxas correspondentes. As regras de faturamento são as mesmas dos trabalhos SQL padrão.

    • Se uma atualização automática for acionada, mas não houver alterações nos dados, o MaxCompute não iniciará um trabalho de atualização e nenhuma taxa será cobrada.

    • Recomendamos colocar as Delta Live MVs em um projeto dedicado para facilitar o rastreamento de trabalhos de atualização automática, uso de recursos de computação e custos.

  • Taxas de armazenamento

    • O faturamento de armazenamento das Delta Live MVs segue o mesmo modelo das materialized views padrão e tabelas regulares.

    • Para alguns operadores, uma Delta Live MV pode usar um algoritmo de computação incremental baseado em estado, o que gera tabelas de estado internas e consome armazenamento adicional.

    • Uma Delta Live MV incorre em sobrecarga de armazenamento para CDC e Time Travel. Essa sobrecarga é semelhante à de uma Delta Table padrão.