Partilhar 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 oferecem suporte à atualização incremental. Inclui discussão sobre as diferenças entre atualizações incrementais e completas e inclui recomendações para escolher entre visualizaçõ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 detetando alterações nas fontes de dados usadas para definir a exibição materializada e calculando incrementalmente o resultado.

As atualizações são executadas em 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 Lakeflow Spark Declarative Pipelines.

Para exibições materializadas definidas usando o Databricks SQL, o seu espaço de trabalho não precisa estar habilitado para pipelines declarativos do Lakeflow Spark sem servidor. A atualização usará automaticamente um fluxo de trabalho sem servidor.

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

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

Visualizaçõ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 Azure Databricks, o resultado é calculado usando semântica em 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 em cache os resultados 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 visualizações materializadas.

O exemplo a seguir transforma esta consulta em lote numa vista 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 da 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 no transactions_table de origem para calcular os resultados.

Considerações sobre a fonte de dados para vistas materializadas

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

Important

As visualizações materializadas fazem uma tentativa de melhor esforço para atualizar incrementalmente os resultados das operações suportadas. 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 semântica de atualização completa, mesmo que a consulta que define a exibição materializada ofereça suporte à atualização incremental.

  • Para consultas em que uma atualização completa seria proibitiva em termos de custo, use tabelas de streaming para garantir o processamento uma única vez. Os exemplos incluem tabelas muito grandes.
  • Não defina uma visão materializada em relação a uma fonte de dados se os registros só devem 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 Kafka.
    • Operações de ingestão, como consultas que usam o Auto Loader para ingerir dados do armazenamento de objectos na cloud.
    • 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 onde você planeja excluir registros anteriores a um determinado limite.
  • Nem todas as fontes de dados oferecem suporte a atualizações incrementais. As seguintes fontes de dados oferecem suporte à atualização incremental:
    • Tabelas Delta, incluindo tabelas gerenciadas pelo Unity Catalog e tabelas externas apoiadas pelo Delta Lake.
    • Visões materializadas.
    • Tabelas de streaming, incluindo os alvos das operações AUTO CDC ... INTO.
  • Algumas operações de atualização incremental exigem que o rastreamento de linhas seja habilitado nas fontes de dados consultadas. O rastreamento de linhas é um recurso Delta Lake suportado apenas por tabelas Delta, que incluem exibições materializadas, tabelas de streaming e tabelas gerenciadas pelo Unity Catalog. Consulte Use o rastreamento de linhas em tabelas Delta.
  • As fontes de dados com filtros de linhas ou máscaras de coluna definidas não suportam a atualização incremental. Ver Filtros de linha e máscaras de coluna

Otimize visualizaçõ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 posteriormente com a ALTER TABLE instrução. Por exemplo:

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

Tipos de atualização 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á um recálculo completo dos dados, se necessário. A atualização incremental só está disponível quando a computação à qual você está conectado não tem servidor.
  • Uma atualização completa sempre recalcula todas as entradas para a exibição materializada e redefine todos os pontos de verificação.

Para determinar que tipo de atualização uma atualização utilizou, consulte Determine o tipo de atualização de uma atualização.

Atualização padrão

A atualização padrão para uma exibição materializada em serverless tenta 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, apenas certos tipos de exibições materializadas podem ser atualizadas incrementalmente. Se uma atualização incremental não for possível ou se a computação conectada for clássica em vez de sem servidor, uma recomputação completa será executada.

A saída de uma atualização incremental e um recálculo completo são os mesmos. O Azure Databricks executa uma análise de custos para escolher a opção mais barata entre uma atualização incremental e uma recomputação completa.

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

Quando você cria exibições materializadas com um SQL warehouse ou pipelines declarativos do Lakeflow Spark sem servidor, o Azure Databricks as atualiza incrementalmente se suas consultas forem suportadas. Se uma consulta usar expressões sem suporte, o Azure Databricks executará uma recomputação completa, o que pode aumentar os custos.

Para determinar que tipo de atualização uma atualização utilizou, consulte Determine o tipo de atualização de uma atualização.

Atualização completa

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

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

REFRESH MATERIALIZED VIEW mv_name FULL

Para exibições materializadas definidas em Lakeflow Spark Declarative Pipelines, você pode optar por executar uma atualização completa em conjuntos de dados selecionados ou em todos os conjuntos de dados em um pipeline. Consulte 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 computados. Talvez você não consiga recuperar dados antigos se os dados não estiverem mais disponíveis na fonte. Isso também pode alterar o esquema para colunas que não existem mais nos dados de origem.

Suporte para atualização incremental de visualizaçã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. Consulte Use o rastreamento de linhas em tabelas Delta.

Estas palavras-chave e cláusulas estão marcadas com uma estrela (*) na tabela seguinte.

Palavra-chave ou cláusula SQL Suporte para atualização incremental
SELECT Expressões* Sim, expressões incluindo funções incorporadas determinísticas e funções definidas pelo usuário (UDFs) imutáveis são suportadas.
GROUP BY Yes
WITH Sim, expressões de tabela comuns são suportadas.
UNION ALL* Yes
FROM As tabelas base suportadas incluem tabelas Delta, vistas materializadas e tabelas de streaming.
WHERE, HAVING* Cláusulas de filtro como WHERE e HAVING são suportadas.
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, as visualizações materializadas que incluem expectativas podem ser atualizadas gradualmente. No entanto, a atualização incremental não é suportada para os seguintes casos:
  • Quando a visão materializada é lida a partir de uma visão que contém expectativas.
  • Quando a visã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 são suportadas em WHERE cláusulas. Isso inclui funções como current_date(), current_timestamp()e now(). Outras funções não determinísticas não são suportadas.
Fontes não-Delta Não há suporte para fontes como volumes, locais externos e catálogos estrangeiros.

Determinar o tipo de atualização

Para otimizar o desempenho de 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 essas técnicas:

Technique Atualização incremental? Description
FULL_RECOMPUTE No A visão materializada foi totalmente recalculada
NO_OP Não aplicável A vista materializada não foi atualizada porque não foram detetadas alterações à tabela base.
Qualquer um dos seguintes:
  • ROW_BASED
  • PARTITION_OVERWRITE
  • WINDOW_FUNCTION
  • APPEND_ONLY
  • GROUP_AGGREGATE
  • GENERIC_AGGREGATE
Yes A visão materializada foi atualizada de forma incremental usando a técnica especificada.

Para determinar a técnica usada, consulte o log de eventos Lakeflow Spark Declarative Pipelines onde o 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 Log de eventos do pipeline.