Como é feita a atualização de tabela dinâmica

O conteúdo da tabela dinâmica é baseado nos resultados de uma consulta específica. Quando os dados subjacentes nos quais a tabela dinâmica se baseia são alterados, a tabela é atualizada para refletir essas alterações. Essas atualizações são chamadas de atualização. Este processo é automatizado e envolve a análise da consulta que está subjacente à tabela. As seções a seguir explicam como as tabelas dinâmicas são atualizadas e como a instrução SELECT para uma tabela dinâmica pode determinar o tipo de atualização usado.

Inicialização da tabela dinâmica

Quando uma tabela dinâmica é criada usando uma instrução CREATE DYNAMIC TABLE, a tabela dinâmica é inicialmente preenchida com dados das tabelas subjacentes. Após a criação, a tabela dinâmica passa por uma atualização completa, incluindo tabelas dinâmicas com atraso a jusante. A atualização garante o isolamento do instantâneo, sincronizando todas as tabelas dinâmicas envolvidas, economizando custos com atualizações sem dados para tabelas dinâmicas a montante.

Essa atualização inicial pode levar algum tempo, especialmente se for necessária uma varredura extensa de dados, e a duração da criação da tabela dinâmica depende do tamanho dos dados varridos. Para acompanhar o progresso, consulte o histórico de atualizações usando information_schema.dynamic_table_refresh_history() e procure entradas com refresh_trigger = INITIAL.

Se a inicialização falhar, o processo de criação da tabela será interrompido, fornecendo feedback imediato sobre quaisquer definições incorretas. Durante a inicialização de uma nova versão de uma tabela dinâmica existente, a versão existente permanece acessível até que a nova versão esteja disponível, garantindo que a falha na criação de uma nova versão não afete a instância atual.

Tipos de atualização de tabela dinâmica

O processo de atualização da tabela dinâmica ocorre de duas maneiras:

  1. Atualização incremental: esse processo automatizado analisa a consulta da tabela dinâmica e calcula as alterações desde a última atualização. Em seguida, ele mescla essas alterações na tabela. Consulte Tipos de consultas compatíveis com atualizações incrementais para obter detalhes sobre consultas suportadas.

  2. Atualização completa: quando o processo automatizado não consegue realizar uma atualização incremental, ele realiza uma atualização completa. Isso envolve a execução da consulta da tabela dinâmica e a substituição completa dos resultados materializados anteriores.

As construções usadas na consulta determinam se uma atualização incremental pode ser usada. Depois de criar uma tabela dinâmica, você pode monitorar a tabela para determinar se atualizações incrementais ou completas são usadas para atualizar essa tabela.

Compreensão da meta de atraso

A atualização dinâmica da tabela é acionada com base em como os dados podem estar desatualizados, ou o que é comumente referido como atraso ou meta de atraso.

A meta de atraso é especificada de duas maneiras:

  1. Medida do nível de atualização: define a quantidade máxima de tempo que o conteúdo da tabela dinâmica deve atrasar as atualizações nas tabelas de base.

    Especificado usando o parâmetro TARGET_LAG = { num { seconds | ... | days } ao alterar ou definir originalmente uma tabela dinâmica.

  2. DOWNSTREAM: especifica que a tabela dinâmica deve ser atualizada sob demanda quando outras tabelas dinâmicas que dependem dela precisarem ser atualizadas. As atualizações são inferidas de objetos de banco de dados a montante. As tabelas dinâmicas a jusante são atualizadas apenas quando exigidas pelos consumidores a montante.

Considere o seguinte exemplo em que a tabela dinâmica 2 (DT2) é definida com base na tabela dinâmica 1 (DT1). DT2 deve ler DT1 para materializar seu conteúdo. Além disso, um relatório consome dados do DT2 por meio de uma consulta.

Simple example of two dynamic tables, DT2 which is defined based on DT1.

Os seguintes resultados são possíveis, dependendo de como cada tabela dinâmica especifica seu atraso:

Tabela dinâmica 1 (DT1)

Tabela dinâmica 2 (DT2)

Atualizar resultados

TARGET_LAG = DOWNSTREAM

TARGET_LAG = 10minutes

DT2 é atualizado no máximo a cada 10 minutos. DT1 obtém, ou infere, seu atraso de DT2 e é atualizado sempre que DT2 exigir atualizações.

TARGET_LAG = 10minutes

TARGET_LAG = DOWNSTREAM

Este cenário deve ser evitado. A consulta do relatório não receberá nenhum dado. DT2 não é atualizado porque nenhum DT foi criado em cima de DT2. Além disso, DT1 será atualizado com frequência.

TARGET_LAG = 5minutes

TARGET_LAG = 10minutes

DT2 é atualizado aproximadamente a cada 10 minutos com dados de DT1 ou seja, no máximo 5 minutos.

TARGET_LAG = DOWNSTREAM

TARGET_LAG = DOWNSTREAM

DT2 não é atualizado periodicamente porque DT1 não tem filhos a jusante com um atraso definido.

Tipos de consultas compatíveis com atualizações incrementais

A tabela a seguir descreve as expressões, palavras-chave e cláusulas que atualmente oferecem suporte à atualização incremental.

Nota

Se a consulta usar expressões que não são suportadas para atualização incremental, o processo de atualização automatizada usará uma atualização completa. Para determinar qual modo de atualização será usado, consulte Como determinar se é usada uma atualização incremental ou completa.

Palavra-chave/cláusula

Suporte para atualizações incrementais

WITH

Expressões de tabela comuns (CTE) que usam recursos compatíveis com atualização incremental na subconsulta.

Expressões em SELECT

Expressões, incluindo aquelas que usam funções internas determinísticas e funções imutáveis definidas pelo usuário.

FROM

Tabelas, exibições e outras tabelas dinâmicas de origem.

OVER

Todas as funções de janela.

WHERE

Filtra com as mesmas expressões válidas em SELECT.

JOIN (e outras expressões para unir tabelas)

As tabelas dinâmicas atualmente suportam apenas junções internas, junções externas e junções cruzadas para atualizações incrementais.

Nota

Para usar atualizações incrementais, você deve recriar tabelas dinâmicas que usam outros tipos de junções

Para determinar se você precisa recriar a tabela dinâmica, use um dos seguintes procedimentos para verificar se a tabela dinâmica usa uma atualização completa:

Você pode especificar qualquer número de tabelas na junção.

As atualizações de todas as tabelas na junção são refletidas nos resultados da consulta.

UNION ALL

Tabelas dinâmicas oferecem suporte a UNION ALL.

GROUP BY

Tabelas dinâmicas oferecem suporte a GROUP BY.

Importante

Substituir uma UDF imutável enquanto ela estiver em uso por uma tabela dinâmica de atualização incremental resultará em comportamento indefinido na tabela dinâmica usando a UDF.

Atualmente, as seguintes construções e tipos de consultas não são compatíveis com atualizações incrementais. Se você especificá-los na consulta, o processo de atualização automática usará uma atualização completa (o que pode resultar em um custo maior) para atualizar a tabela.

  • Junções LATERAL

  • Subconsultas fora das cláusulas FROM (por exemplo, WHERE EXISTS)

  • Funções definidas pelo usuário VOLATILE

Como os dados são atualizados quando as tabelas dinâmicas dependem de outras tabelas dinâmicas

Quando um atraso de tabela dinâmica é especificado como uma medida de tempo, o processo de atualização automatizado determina o planejamento para atualizações, com base nos tempos de atraso de destino das tabelas dinâmicas. O processo escolhe um cronograma que melhor atenda aos tempos da meta de atraso das tabelas.

Nota

A meta de atraso não é uma garantia. Em vez disso, é uma meta que o Snowflake tenta atingir. Os dados em tabelas dinâmicas são atualizados o mais próximo possível da meta de atraso. No entanto, a meta de atraso pode ser excedido devido a fatores como tamanho do warehouse, tamanho dos dados, complexidade da consulta e fatores semelhantes.

Para manter os dados consistentes nos casos em que uma tabela dinâmica depende de outra, o processo atualiza todas as tabelas dinâmicas em uma conta em horários compatíveis. O momento das atualizações menos frequentes coincide com o momento das atualizações mais frequentes.

Por exemplo, suponha que a tabela dinâmica A tenha uma meta de atraso de dois minutos e consulte a tabela dinâmica B que tenha uma meta de atraso de um minuto. O processo pode determinar que A deve ser atualizado a cada 96 segundos e B a cada 48 segundos. Como resultado, o processo pode aplicar o seguinte cronograma:

Ponto específico no tempo

Tabelas dinâmicas atualizadas

2022-12-01 00:00:00

A, B

2022-12-01 00:00:48

B

2022-12-01 00:01:36

A, B

2022-12-01 00:02:24

B

Isso significa que, a qualquer momento, ao consultar um conjunto de tabelas dinâmicas que dependem umas das outras, você está consultando o mesmo “instantâneo” dos dados nessas tabelas.

Observe que a meta de atraso de uma tabela dinâmica não pode ser menor que a meta de atraso das tabelas dinâmicas das quais ela depende. Por exemplo, suponha que você especifique o seguinte:

  • A tabela dinâmica A consulta as tabelas dinâmicas B e C.

  • Tabela dinâmica B tem uma meta de atraso de cinco minutos.

  • Tabela dinâmica C tem uma meta de atraso de um minuto.

Isso significa que o tempo da meta de atraso para A não deve ser inferior a cinco minutos (ou seja, não menor que o maior dos tempos de atraso para B e C).

Se você definir o atraso de A para cinco minutos, o processo configurará um cronograma de atualização com estes objetivos:

  • Atualize C com frequência suficiente para manter o atraso abaixo de um minuto.

  • Atualize A e B juntos e com frequência suficiente para manter seus atrasos abaixo de cinco minutos.

  • Certifique-se de que a atualização de A e B coincida com uma atualização de C para garantir o isolamento do instantâneo.

Observação: se as atualizações demorarem muito, o agendador poderá ignorá-las para tentar se manter atualizado. No entanto, o isolamento do instantâneo é preservado.