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.

Os tempos limite de atualização dinâmica da tabela são determinados pelo parâmetro STATEMENT_TIMEOUT_IN_SECONDS, definindo a duração máxima na conta ou no warehouse antes de ser cancelado automaticamente.

As seções a seguir explicam a atualização dinâmica da tabela com mais detalhes:

Modos de atualização de tabelas dinâmicas

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 Consultas suportadas na atualização incremental 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 de tabelas dinâmicas é acionada com base em como os dados podem estar desatualizados, ou o que é comumente referido como atraso de destino. O atraso de destino para uma tabela dinâmica é medido em relação às tabelas base na raiz do gráfico, não em relação às tabelas dinâmicas diretamente upstream. O Snowflake agenda atualizações para manter o atraso real de suas tabelas dinâmicas abaixo do atraso de destino. A duração de cada atualização depende da consulta, do padrão de dados e do tamanho do warehouse. Ao escolher um atraso de destino, considere o tempo necessário para atualizar cada tabela dinâmica em uma cadeia até a raiz. Caso contrário, algumas atualizações poderão ser ignoradas, resultando em um maior atraso real.

Para ver o gráfico de tabelas conectadas à sua tabela dinâmica, consulte Uso do Snowsight para examinar o gráfico de tabelas dinâmicas.

O atraso de destino é especificado de uma das seguintes maneiras:

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

    O exemplo a seguir define a tabela dinâmica product para atualizar e manter a atualidade a cada hora:

    ALTER DYNAMIC TABLE product SET TARGET_LAG = '1 hour';
    
    Copy
  2. Downstream: Especifica que a tabela dinâmica deve ser atualizada sob demanda quando outras tabelas dinâmicas dependentes forem atualizadas. Essa atualização pode ser acionada pela atualização manual ou agendada de uma tabela dinâmica downstream.

    No exemplo a seguir, product é baseado em outras tabelas dinâmicas e é definido para atualizar com base no atraso de destino de suas tabelas dinâmicas downstream:

    ALTER DYNAMIC TABLE product SET TARGET_LAG = DOWNSTREAM;
    
    Copy

O atraso de destino é inversamente proporcional à frequência de atualização da tabela dinâmica: atualizações frequentes implicam em um atraso menor.

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.

Exemplo simples de duas tabelas dinâmicas, DT2 que é definida com base em 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 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. DT 1 é atualizado com frequência e DT2 não é atualizado porque não há uma tabela dinâmica baseada em DT2.

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.

Consultas suportadas na atualização incremental

A tabela a seguir descreve as expressões, palavras-chave e cláusulas que atualmente oferecem suporte à atualização incremental. Para obter uma lista de consultas que não oferecem suporte à atualização incremental, consulte Limitações ao suporte para atualização incremental.

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. Subconsultas fora das cláusulas FROM (por exemplo, WHERE EXISTS) não são suportadas.

OVER

Todas as funções de janela.

WHERE/HAVING/QUALIFY

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

JOIN (e outras expressões para unir tabelas)

Os tipos de junção aceitos para atualização incremental incluem junções internas, junções externas equivalentes, junções cruzadas e nivelamento lateral (somente a função de tabela FLATTEN não estática). Você pode especificar qualquer número de tabelas na junção e as atualizações em todas as tabelas na junção serão refletidas nos resultados da consulta.

A seleção da coluna SEQ de nivelamento a partir de uma junção de nivelamento lateral não é compatível para atualização incremental.

UNION ALL

Tabelas dinâmicas oferecem suporte a UNION ALL.

GROUP BY

Tabelas dinâmicas oferecem suporte a GROUP BY.

Importante

Se uma consulta usar expressões que não sejam compatíveis com a atualização incremental, o processo de atualização automatizada usará uma atualização completa, o que pode acarretar um custo adicional. Para determinar qual modo de atualização será usado, consulte Como determinar se é usada uma atualização incremental ou completa.

Substituir uma função definida pelo usuário IMMUTABLE (UDF) enquanto ela está em uso por uma tabela dinâmica que usa atualização incremental resulta em um comportamento indefinido nessa tabela. UDFs VOLATILE não são suportadas com atualização incremental.

Atualmente, junções laterais não são aceitas com atualização incremental. No entanto, você pode usar LATERAL com FLATTEN() configurando o modo de atualização como INCREMENTAL.

Por exemplo:

CREATE TABLE persons
  AS
    SELECT column1 AS id, parse_json(column2) AS entity
    FROM values
      (12712555,
      '{ name:  { first: "John", last: "Smith"},
        contact: [
        { business:[
          { type: "phone", content:"555-1234" },
          { type: "email", content:"j.smith@company.com" } ] } ] }'),
      (98127771,
      '{ name:  { first: "Jane", last: "Doe"},
        contact: [
        { business:[
          { type: "phone", content:"555-1236" },
          { type: "email", content:"j.doe@company.com" } ] } ] }') v;

CREATE DYNAMIC TABLE example
  TARGET_LAG = DOWNSTREAM
  WAREHOUSE = mywh
  REFRESH_MODE = INCREMENTAL
  AS
    SELECT p.id, f.value, f.path
    FROM persons p,
    LATERAL FLATTEN(input => p.entity) f;
Copy

Nota

A seleção da coluna SEQ de nivelamento a partir de uma junção de nivelamento lateral não é compatível para atualização incremental.

Como os operadores atualizam incrementalmente

A tabela a seguir descreve como cada operador é incrementalizado (ou seja, como ele é transformado em um novo fragmento de consulta que gera alterações em vez de resultados completos) e seu desempenho e outros fatores importantes a serem considerados.

Operador

Incrementalização

Considerações

SELECT <expressões escalares>

Incrementalizado pela aplicação de expressões a linhas alteradas.

Tem bom desempenho, sem considerações especiais.

WHERE <expressões escalares>

Incrementalizado avaliando o predicado em cada linha alterada e incluindo apenas aquelas para as quais o predicado é verdadeiro.

Geralmente tem bom desempenho. O custo é escalonado linearmente com o tamanho das mudanças.

Atualizando uma tabela dinâmica com uma expressão WHERE altamente seletiva pode exigir tempo de atividade do warehouse, mesmo que a tabela dinâmica resultante não mude. Isso ocorre porque um warehouse pode ser necessário para determinar quais alterações nas fontes satisfazem o predicado.

FROM <tabela base>

Incrementalizado pela verificação de micropartições que foram adicionadas ou removidas da tabela desde a última atualização.

O custo é escalonado linearmente com o volume de dados nas micropartições adicionadas ou removidas.

Recomendações:

  • Limite o volume de alterações por atualização a cerca de 5% da tabela de origem.

  • Seja cauteloso com DMLs que afetam muitas micropartições.

<consulta> UNION ALL <consulta>

Incrementalizado pela união de todas as alterações em cada lado.

Tem bom desempenho, sem considerações especiais.

WITH <lista CTE><consulta>

Incrementalizado pelo cálculo das alterações de cada expressão de tabela comum.

WITH torna consultas complexas mais fáceis de ler, mas tenha cuidado para não tornar a definição de uma única tabela dinâmica muito complexa. Para obter mais informações, consulte Como encadear pipelines de tabelas dinâmicas e Otimização do desempenho do modo de atualização incremental para tabelas dinâmicas complexas.

Agregados escalares

Atualmente, os agregados escalares não são incrementalizados de forma eficiente. Quando a entrada deles muda, eles são totalmente recalculados.

GROUP BY <chaves>

Incrementalizado pela recomputação de agregados para cada chave de agrupamento que mudou.

Garanta que os dados de origem sejam clusterizados pelas chaves de agrupamento e que as alterações compreendam uma pequena fração (aproximadamente < 5%) das chaves de agrupamento.

Se a chave de agrupamento contiver uma expressão composta em vez de uma coluna base, atualizações incrementais poderão ter que verificar uma grande quantidade de dados. Para reduzir o tamanho dessas verificações, materialize a expressão em uma tabela dinâmica e, em seguida, aplique a operação de agrupamento na coluna materializada em outra tabela dinâmica.

Por exemplo, considere a seguinte instrução composta:

CREATE DYNAMIC TABLE sums
  AS
    SELECT date_trunc(minute, ts), sum(c1) FROM table
    GROUP BY 1;
Copy

A instrução acima pode ser otimizada da seguinte forma:

CREATE DYNAMIC TABLE intermediate
  AS
    SELECT date_trunc(minute, ts) ts_min, c1 FROM table;
Copy
CREATE DYNAMIC TABLE sums
  AS
    SELECT ts_min, sum(c1) FROM intermediate
    GROUP BY 1;
Copy

DISTINCT

Equivalente a GROUP BY ALL sem funções de agregação.

Muitas vezes representa uma oportunidade substancial de otimização.

É uma prática comum aplicar DISTINCT generosamente em todas as consultas para evitar a introdução acidental de duplicatas. Na atualização incremental, as operações DISTINCT consomem recursos de forma recorrente porque duplicatas precisam ser verificadas durante cada atualização.

Ao otimizar o desempenho, encontrar e remover DISTINCTs redundantes pode ser uma vitória fácil. Você pode fazer isso eliminando duplicatas upstream e considerando cuidadosamente as cardinalidades de junção.

<fn> OVER <janela>

Incrementalizado pela recomputação da função de janela para cada chave de partição alterada.

Certifique-se de que há uma cláusula PARTITION BY em sua consulta e os dados de origem são clusterizados por chaves de partição. Certifique-se também de que as alterações incluem uma pequena fração (aproximadamente < 5%) das partições.

<esquerdo> INNER JOIN <direito>

Incrementalizado unindo as alterações do lado esquerdo com as do lado direito e, em seguida, unindo as alterações do lado direito com as do lado esquerdo.

Se um dos lados da junção for pequeno, o desempenho provavelmente será bom. Se um dos lados da junção muda com frequência, clusterizar o outro lado pela chave de junção pode melhorar o desempenho.

<esquerdo> [{LEFT | RIGHT | FULL}] OUTER JOIN <direito>

Incrementalizado ao fatorar em uma operação INNER JOIN e UNION ALL com uma ou duas cláusulas NOT EXISTS para calcular NULLs para não correspondências. Essa consulta fatorada é então incrementalizada.

A junção interna é incrementalizada conforme mostrado. Os inexistentes são incrementalizados verificando se as chaves alteradas de um lado já existiam do outro lado.

Recomendações:

  • Se um dos lados da junção muda com frequência, clusterizar o outro lado pela chave de junção pode melhorar o desempenho.

  • Coloque a tabela que muda com mais frequência no lado esquerdo.

  • Tente minimizar as mudanças no lado oposto ao OUTER. Então para LEFT OUTER, minimize as alterações no lado direito.

  • Para junções FULL, a localidade é muito importante.

Funções não determinísticas suportadas em atualização completa

As seguintes funções não determinísticas são suportadas em tabelas dinâmicas. Observe que essas funções são suportadas apenas para atualizações completas. Para obter uma lista do que não é compatível com atualização incremental, consulte Limitações ao suporte para atualização incremental.

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.