Compartilhar via


Atualização incremental para exibições materializadas

Este artigo descreve a semântica e os requisitos para atualizações incrementais em exibições materializadas e identifica as operações, palavras-chave e cláusulas SQL que dão suporte à atualização incremental. Ele inclui discussão sobre as diferenças entre atualizações incrementais e completas e inclui recomendações para escolher entre exibições materializadas e tabelas de streaming.

Ao executar atualizações em exibições materializadas usando pipelines sem servidor, muitas consultas podem ser atualizadas incrementalmente. As atualizações incrementais economizam custos de computação detectando alterações nas fontes de dados usadas para definir a exibição materializada e calculando incrementalmente o resultado.

Atualizações são executadas na computação sem servidor

As operações de atualização são executadas em pipelines sem servidor, independentemente se a operação foi definida no DATAbricks SQL ou com Pipelines Declarativos do Lakeflow Spark.

Para exibições materializadas definidas usando o DATAbricks SQL, seu workspace não precisa ser habilitado para pipelines declarativos do Lakeflow Spark sem servidor. A atualização usará um pipeline sem servidor automaticamente.

Para exibições materializadas definidas usando o Lakeflow Spark Declarative Pipelines, você deve configurar o pipeline para usar sem servidor. Consulte Configurar um pipeline sem servidor.

Quais são as semânticas de atualização para as exibições materializadas?

As exibições materializadas garantem resultados equivalentes às consultas em lote. Por exemplo, considere a seguinte consulta agregada:

SELECT account_id,
  COUNT(txn_id) txn_count,
  SUM(txn_amount) account_revenue
FROM transactions_table
GROUP BY account_id

Quando você executa essa consulta usando qualquer produto do Azure Databricks, o resultado é calculado usando a semântica do lote para agregar todos os registros na origem transactions_table, o que significa que todos os dados de origem são verificados e agregados em uma operação.

Note

Alguns produtos do Azure Databricks armazenam os resultados em cache automaticamente dentro ou entre sessões se as fontes de dados não tiverem sido alteradas após a execução da última consulta. Os comportamentos de cache automático diferem das exibições materializadas.

O exemplo a seguir transforma essa consulta em lote em uma exibição materializada:

CREATE OR REPLACE MATERIALIZED VIEW transaction_summary AS
SELECT account_id,
  COUNT(txn_id) txn_count,
  SUM(txn_amount) account_revenue
FROM transactions_table
GROUP BY account_id

Quando você atualiza uma exibição materializada, o resultado calculado é idêntico à semântica de consulta em lote. Essa consulta é um exemplo de uma exibição materializada que pode ser atualizada incrementalmente, o que significa que a operação de atualização faz uma tentativa de melhor esforço para processar apenas dados novos ou alterados na origem transactions_table para calcular os resultados.

Considerações sobre a fonte de dados para as exibições materializadas

Embora você possa definir uma exibição materializada em qualquer fonte de dados, nem todas as fontes de dados são adequadas para exibições materializadas. Considere as seguintes advertências e recomendações:

Important

As exibições materializadas fazem uma tentativa de melhor esforço para atualizar incrementalmente os resultados de operações com suporte. Algumas alterações nas fontes de dados exigem uma atualização completa.

Todas as fontes de dados para exibições materializadas devem ser robustas para a semântica de atualização completa, mesmo que a consulta que define a exibição materializada dê suporte à atualização incremental.

  • Para consultas em que uma atualização completa seria proibitiva de custo, use tabelas de streaming para garantir o processamento exatamente uma vez. Os exemplos incluem tabelas muito grandes.
  • Não defina uma exibição materializada em relação a uma fonte de dados se os registros só deverem ser processados uma vez. Em vez disso, use tabelas de streaming. Os exemplos incluem o seguinte:
    • Fontes de dados que não retêm o histórico de dados, como o Kafka.
    • Operações de ingestão, como consultas que usam o Carregador Automático para ingerir dados do armazenamento de objetos na nuvem.
    • Qualquer fonte de dados em que você planeja excluir ou arquivar dados após o processamento, mas precisa reter informações em tabelas downstream. Por exemplo, uma tabela particionada por data em que você planeja excluir registros mais antigos do que um determinado limite.
  • Nem todas as fontes de dados dão suporte a atualizações incrementais. As seguintes fontes de dados dão suporte à atualização incremental:
    • Tabelas Delta, incluindo tabelas gerenciadas pelo Unity Catalog e tabelas externas suportadas pelo Delta Lake.
    • Visões materializadas.
    • Tabelas de streaming, incluindo os destinos das operações AUTO CDC ... INTO.
  • Algumas operações de atualização incremental exigem que o acompanhamento de linhas seja habilitado nas fontes de dados consultadas. O acompanhamento de linhas é um recurso do Delta Lake com suporte apenas das tabelas Delta, que incluem exibições materializadas, tabelas de streaming e tabelas gerenciadas do Catálogo do Unity. Veja Uso do acompanhamento de linhas para tabelas Delta.
  • Fontes de dados com filtros de linha ou máscaras de coluna definidas não dão suporte à atualização incremental. Ver filtros de linha e máscaras de coluna

Otimizar as exibições materializadas

Para obter o melhor desempenho, o Databricks recomenda habilitar os seguintes recursos em todas as tabelas de origem de exibição materializadas:

Você pode definir esses recursos durante a criação ou posterior com a instrução ALTER TABLE . Por exemplo:

ALTER TABLE <table-name> SET TBLPROPERTIES (
  delta.enableDeletionVectors = true,
  delta.enableRowTracking = true,
  delta.enableChangeDataFeed = true);

Atualizar tipos para exibições materializadas

Quando uma exibição materializada é atualizada, você pode especificar uma atualização ou uma atualização completa.

  • Uma atualização tenta fazer uma atualização incremental, mas fará uma recompilação completa dos dados, se necessário. A atualização incremental só estará disponível quando a computação à qual você está conectado estiver sem servidor.
  • Uma atualização completa sempre recalcula todas as entradas para o modo de exibição materializado e redefine todos os pontos de verificação.

Para determinar qual tipo de atualização uma atualização usou, consulte Determinar o tipo de atualização de uma atualização.

Atualização padrão

A atualização padrão para uma exibição materializada em tentativas sem servidor de executar uma atualização incremental. Uma atualização incremental processa alterações nos dados subjacentes após a última atualização e, em seguida, acrescenta esses dados à tabela. Dependendo das tabelas base e das operações incluídas, somente determinados tipos de exibições materializadas podem ser atualizados incrementalmente. Se uma atualização incremental não for possível ou a computação conectada for clássica em vez de sem servidor, uma recompute completa será executada.

A saída de uma atualização incremental e uma recomputação completa são as mesmas. O Azure Databricks executa uma análise de custo para escolher a opção mais barata entre uma atualização incremental e uma recompute completa.

Somente exibições materializadas atualizadas que usam pipelines sem servidor podem usar a atualização incremental. As exibições materializadas que não usam pipelines sem servidor são sempre totalmente recomputadas.

Quando você cria exibições materializadas com um depósito de dados SQL ou Pipelines Declarativos do Spark Lakeflow, o Azure Databricks os atualiza incrementalmente se houver suporte para suas consultas. Se uma consulta usa expressões sem suporte, o Azure Databricks executa uma recompute completa, o que pode aumentar os custos.

Para determinar qual tipo de atualização uma atualização usou, consulte Determinar o tipo de atualização de uma atualização.

Atualização completa

Uma atualização completa substitui os resultados na exibição materializada limpando a tabela e os pontos de verificação e reprocessando todos os dados disponíveis na origem.

Para executar uma atualização completa em exibições materializadas definidas usando o Databricks SQL, use a seguinte sintaxe:

REFRESH MATERIALIZED VIEW mv_name FULL

Para exibições materializadas definidas em Pipelines Declarativos do Lakeflow Spark, você pode optar por executar uma atualização completa em conjuntos de dados selecionados ou em todos os conjuntos de dados em um pipeline. Veja a Semântica de atualização do pipeline.

Important

Quando uma atualização completa é executada em uma fonte de dados em que os registros foram removidos devido ao limite de retenção de dados ou exclusão manual, os registros removidos não são refletidos nos resultados calculados. Talvez você não consiga recuperar dados antigos se os dados não estiverem mais disponíveis na origem. Isso também pode alterar o esquema de colunas que não existem mais nos dados de origem.

Suporte para atualização incremental de exibição materializada

A tabela a seguir lista o suporte para atualização incremental por palavra-chave ou cláusula SQL.

Important

Algumas palavras-chave e cláusulas exigem que o rastreamento de linhas seja habilitado nas fontes de dados consultadas. Veja Uso do acompanhamento de linhas para tabelas Delta.

Essas palavras-chave e cláusulas são marcadas com uma estrela (*) na tabela a seguir.

Palavra-chave ou cláusula SQL Suporte para atualização incremental
Expressões SELECT* Sim, há suporte para expressões que incluem funções internas determinísticas e funções definidas pelo usuário (UDFs) imutáveis.
GROUP BY Yes
WITH Sim, há suporte para expressões de tabela comuns.
UNION ALL* Yes
FROM As tabelas base com suporte incluem tabelas Delta, exibições materializadas e tabelas de streaming.
WHERE, HAVING* Cláusulas de filtro como WHERE e HAVING têm suporte.
INNER JOIN* Yes
LEFT OUTER JOIN* Yes
FULL OUTER JOIN* Yes
RIGHT OUTER JOIN* Yes
OVER Yes. PARTITION_BY colunas devem ser especificadas para incrementalização em funções de janela.
QUALIFY Yes
EXPECTATIONS Sim, exibições materializadas que incluem expectativas podem ser atualizadas incrementalmente. No entanto, não há suporte para a atualização incremental para os seguintes casos:
  • Quando a exibição materializada lê de uma exibição que contém expectativas.
  • Quando a exibição materializada tem uma DROP expectativa e inclui NOT NULL colunas em seu esquema.
Funções não determinísticas Funções de tempo não determinísticas têm suporte em WHERE cláusulas. Isso inclui funções como current_date(), current_timestamp()e now(). Não há suporte para outras funções não determinísticas.
Fontes não Delta Não há suporte para fontes como volumes, locais externos e catálogos estrangeiros.

Determinar o tipo de atualização de uma atualização

Para otimizar o desempenho das atualizações de exibição materializadas, o Azure Databricks usa um modelo de custo para selecionar a técnica usada para a atualização. A tabela a seguir descreve estas técnicas:

Technique Atualização incremental? Description
FULL_RECOMPUTE No A exibição materializada foi totalmente recomputada
NO_OP Não aplicável A exibição materializada não foi atualizada porque nenhuma alteração na tabela base foi detectada.
Qualquer um dos:
  • ROW_BASED
  • PARTITION_OVERWRITE
  • WINDOW_FUNCTION
  • APPEND_ONLY
  • GROUP_AGGREGATE
  • GENERIC_AGGREGATE
Yes A exibição materializada foi atualizada incrementalmente usando a técnica especificada.

Para determinar a técnica usada, consulte o log de eventos do Lakeflow Spark Declarative Pipelines onde event_type é planning_information:

SELECT
  timestamp,
  message
FROM
  event_log(TABLE(<fully-qualified-table-name>))
WHERE
  event_type = 'planning_information'
ORDER BY
  timestamp desc;

Substitua <fully-qualified-table-name> pelo nome totalmente qualificado da exibição materializada, incluindo o catálogo e o esquema.

Saída de exemplo para este comando:

    • carimbo de data/hora
    • mensagem
    • 2025-03-21T22:23:16.497+00:00
    • Flow 'sales' has been planned in :re[LDP] to be executed as ROW_BASED.

Consulte o log de eventos do Pipeline.