Limite de atualização de tabelas dinâmicas

Use um limite de atualização de tabelas dinâmicas para desacoplar os pipelines de tabela dinâmica enquanto ainda lê os resultados upstream.

Quando uma tabela dinâmica faz referência a outra, as duas são atualizadas juntas como um único pipeline. Embora isso funcione na maioria dos cenários, há certos casos, como o compartilhamento de dados entre equipes, em que a necessidade de atualizar os dados pode variar. Você pode declarar as duas tabelas dinâmicas como independentes (e, portanto, pertencentes a diferentes pipelines), encapsulando a referência a montante em DYNAMIC_TABLE_REFRESH_BOUNDARY(). O isolamento de instantâneos só é garantido em um único pipeline, então tabelas dinâmicas em um limite de atualização não fornecem isolamento de instantâneos umas com as outras.

Visão geral

Por padrão, quando uma tabela dinâmica lê de outra tabela dinâmica, o Snowflake:

  • Atualiza as duas tabelas juntas como parte de um único pipeline.

  • Coordena atualizações para que tabelas dinâmicas a downstream vejam o isolamento de instantâneos em todas as tabelas dinâmicas upstream no pipeline.

  • Impõe regras no nível do pipeline, como verificações de atraso no destino.

Em alguns pipelines, você não quer que cada relacionamento faça com que ambas as tabelas dinâmicas sejam atualizadas juntas. Exemplos comuns incluem:

  • ** Pipelines entre equipes** em que uma equipe publica uma tabela dinâmica que outra equipe consome, mas a tabela dinâmica downstream não deve influenciar ou herdar o pipeline upstream.

  • Migrações incrementais em que você converte uma etapa de pipeline upstream em uma tabela dinâmica, mas não que os consumidores downstream comecem a coordenar atualizações com ela.

  • Padrões Dynamic-table-on-view-on-dynamic-table, em que uma tabela dinâmica lê uma exibição que consulta outra tabela dinâmica. Esse padrão não é compatível, exceto se a exibição estiver agrupada em DYNAMIC_TABLE_REFRESH_BOUNDARY().

Um limite de atualização torna essa separação explícita: as entradas dentro do limite são tratadas como pertencentes a um pipeline separado e lidas como tabelas regulares.

Sintaxe

DYNAMIC_TABLE_REFRESH_BOUNDARY( <object_name> )

Onde:

object_name

Um nome de tabela, exibição, tabela dinâmica ou expressão de tabela comum (CTE).

Use esta palavra-chave na cláusula FROM / JOIN (incluindo em ramificações CTEs e UNION) de uma definição de tabela dinâmica.

Exemplos

O exemplo a seguir lê uma exibição que consulta outra tabela dinâmica. Sem um limite de atualização, não é possível criar uma tabela dinâmica que lê uma exibição em outra tabela dinâmica. Delimitar a exibição em DYNAMIC_TABLE_REFRESH_BOUNDARY() torna esse padrão possível:

CREATE DYNAMIC TABLE analytics.click_analytics_dt
  WAREHOUSE = analytics_wh
  TARGET_LAG = '5 minutes'
AS
SELECT *
FROM DYNAMIC_TABLE_REFRESH_BOUNDARY(analytics.enriched_clicks_view);

O exemplo a seguir une uma tabela dinâmica referenciada diretamente a uma visualização cuja tabela dinâmica upstream é atualizada em intervalos mais longos. Delimitar a exibição em DYNAMIC_TABLE_REFRESH_BOUNDARY() evita que a tabela dinâmica downstream acione a atualização cara upstream a cada 5 minutos, ao mesmo tempo em que permite que ela leia a versão mais recente disponível. O isolamento de instantâneos não é garantido além do limite de atualização:

CREATE DYNAMIC TABLE data_eng.enriched_clicks_dt
  WAREHOUSE = de_wh
  TARGET_LAG = '5 minutes'
AS
SELECT
  c.*,
  p.product_name
FROM data_eng.clickstream_dt AS c
LEFT JOIN DYNAMIC_TABLE_REFRESH_BOUNDARY(product_db.active_products_view) AS p
  ON c.product_id = p.product_id;

Comportamento

Como atualizar limites alteram dependências

Quando você delimita uma entrada em DYNAMIC_TABLE_REFRESH_BOUNDARY() dentro de uma definição de tabela dinâmica:

  • Essa entrada é tratada como uma entrada de limite de atualização para a definição.

  • As tabelas dinâmicas que podem ser acessadas a partir dessa entrada não estão incluídas no pipeline da definição.

  • Na atualização, a tabela dinâmica lê esses objetos na versão atual, não no carimbo de data/hora dos dados coordenado em todo o pipeline.

Como resultado:

Nenhuma atualização em cascata além do limite

Atualizar a tabela dinâmica downstream não aciona atualizações de tabelas dinâmicas que só podem ser acessadas por um limite de atualização.

Agendamento independente

O atraso de destino e o agendamento de atualizações para a tabela dinâmica downstream ignoram as tabelas dinâmicas que só podem ser acessadas pelo limite.

Nenhum isolamento de instantâneos além do limite

A tabela dinâmica downstream lê qualquer versão dos dados upstream disponível no momento da atualização. Não há garantia de que os dados além do limite estejam alinhados com o isolamento de instantâneos que se aplica a outras dependências upstream.

Isolamento de instantâneos vs. limites de atualização

Dentro de um único pipeline (sem limites), o Snowflake garante isolamento de instantâneos em todas as tabelas dinâmicas upstream que participam desse pipeline.

Essa garantia sobre a dependência que vai além do limite é ativada intencionalmente quando os limites são atualizados:

  • Dentro do limite: os objetos são atualizados e coordenados de acordo com seus próprios pipelines.

  • Fora do limite: a tabela dinâmica downstream lê qualquer versão disponível no momento da atualização.

Portanto, uma única definição de tabela dinâmica pode fazer referência a ambos os tipos de entradas:

  • Referências diretas a tabelas dinâmicas upstream, que participam do isolamento de instantâneos e atualizações coordenadas dentro do pipeline.

  • Referências de limite de atualização, que leem a versão mais recente disponível dos dados upstream de forma independente, sem isolamento de instantâneos.

Limites de atualização só devem ser usados em dependências em que você não precisa de isolamento de instantâneos entre as tabelas dinâmicas upstream e downstream.

Casos de uso

Desanexação de pipelines entre equipes

Equipes diferentes podem ser proprietárias de partes diferentes de um pipeline lógico:

  • Equipe A: publica uma tabela dinâmica principal usada em toda a organização.

  • Equipe B: define uma tabela dinâmica downstream que une a tabela dinâmica principal com dados específicos da equipe.

A equipe B pode delimitar a saída da equipe A em um limite de atualização para:

  • Evitar puxar as tabelas dinâmicas da equipe A para seu próprio pipeline.

  • Manter a independência do seu próprio cronograma de atualizações.

  • Tratar a tabela dinâmica da equipe A como uma tabela externa atualizada periodicamente.

Habilitar uma tabela dinâmica que lê exibições em outra tabela dinâmica

Sem um limite de atualização, não é possível criar uma tabela dinâmica que lê uma exibição em outra tabela dinâmica. Com um limite de atualização, é possível marcar explicitamente a dependência da exibição como um limite:

CREATE VIEW v_orders AS
SELECT *
FROM orders_dt;

CREATE DYNAMIC TABLE order_summary_dt
  WAREHOUSE = analytics_wh
  TARGET_LAG = '15 minutes'
AS
SELECT
  customer_id,
  COUNT(*) AS num_orders
FROM DYNAMIC_TABLE_REFRESH_BOUNDARY(v_orders)
GROUP BY customer_id;

Aqui,``order_summary_dt``:

  • Lê de orders_dt por um limite de atualização.

  • Não pertence ao mesmo pipeline que orders_dt.

  • Lê qualquer versão de orders_dt disponível quando ele é atualizado.

Exemplo: exibição de limite de propriedade da equipe

Um padrão comum é uma equipe que é proprietária de uma tabela dinâmica e de uma exibição dela aplicar o limite de atualização dentro da definição da exibição. Outras equipes consomem essa exibição sem introduzir novas dependências à tabela dinâmica da equipe proprietária.

-- Team A: owns product_catalog_dt and publishes a boundary view
CREATE DYNAMIC TABLE product.product_catalog_dt
  WAREHOUSE = product_wh
  TARGET_LAG = '1 hour'
AS
SELECT *
FROM product.raw_products;

CREATE VIEW product.active_products_public_v AS
SELECT * FROM DYNAMIC_TABLE_REFRESH_BOUNDARY(product.product_catalog_dt)
WHERE is_active = TRUE;

-- Team B: consumes Team A's view in their own dynamic table
CREATE DYNAMIC TABLE analytics.active_product_clicks_dt
  WAREHOUSE = analytics_wh
  TARGET_LAG = '5 minutes'
AS
SELECT
  c.*,
  p.product_name
FROM analytics.clickstream_dt AS c
JOIN product.active_products_public_v AS p
  ON c.product_id = p.product_id;

Nesse padrão:

  • A equipe A controla o limite de atualização delimitando product_catalog_dt em product.active_products_public_v.

  • A equipe B e outras equipes definem suas próprias tabelas dinâmicas que fazem referência apenas à exibição publicada.

  • Essas tabelas dinâmicas downstream não adicionam product_catalog_dt ao seu próprio pipeline; product_catalog_dt fica fora dos pipelines, mesmo que os dados estejam visíveis na exibição.

Migração incremental para tabelas dinâmicas

Ao migrar uma etapa de pipeline para uma tabela dinâmica, talvez você não queira que os consumidores downstream:

  • Comecem a acionar atualizações da nova tabela dinâmica.

  • Herdem novos requisitos de atraso no destino.

Se a nova tabela dinâmica (ou uma exibição sobre ela) tiver um limite de atualização, as tabelas dinâmicas downstream poderão consumir sem serem adicionadas ao mesmo pipeline.

Atraso no destino

Os limites de atualização também influenciam como o atraso de destino é aplicado.

O atraso de destino de uma tabela dinâmica upstream deve ser o mesmo ou menor que o de qualquer tabela dinâmica downstream no mesmo pipeline. Tabelas dinâmicas referenciadas por DYNAMIC_TABLE_REFRESH_BOUNDARY() não pertencem ao mesmo pipeline, então essa regra não se aplica além do limite.

As tabelas dinâmicas upstream em um limite de atualização mantêm seu próprio atraso no destino e comportamento de agendamento; as escolhas downstream no limite não afetam essas tabelas.

Restrições e limitações

Os limites de atualização estão sujeitos a algumas regras importantes:

Não é permitido que a mesma tabela dinâmica esteja dentro e fora de um limite de atualização

Todas as referências à mesma tabela dinâmica upstream em uma única definição devem estar diretamente na definição ou delimitadas em DYNAMIC_TABLE_REFRESH_BOUNDARY(). Caso as referências estejam nos dois, versões diferentes da mesma tabela dinâmica poderiam ser lidas. O Snowflake bloqueia essas definições e retorna um erro descritivo.

Destinos de limite incompatíveis

DYNAMIC_TABLE_REFRESH_BOUNDARY() deve delimitar um objeto nomeado (tabela, exibição, tabela dinâmica ou CTE). Ele não pode delimitar:

  • Subconsultas em linha.

  • Funções de tabela ou UDTFs.

  • Chamadas TABLE(...) arbitrárias.

Efeito fora das tabelas dinâmicas

Você pode chamar DYNAMIC_TABLE_REFRESH_BOUNDARY() em consultas SELECT regulares, mas fora de uma definição de tabela dinâmica isso não é uma operação.

Práticas recomendadas

Ao usar limites de atualização em pipelines de tabela dinâmica:

Use um limite de atualização quando:

  • Você quiser consumir a tabela dinâmica de outra equipe sem ingressar no pipeline.

  • Você não precisa isolar instantâneos de uma dependência upstream específica.

  • Uma tabela dinâmica depende de uma exibição que faz referência a outra tabela dinâmica. Esse padrão só é compatível quando a exibição ou a tabela dinâmica upstream é delimitada em DYNAMIC_TABLE_REFRESH_BOUNDARY().

Evite usar um limite de atualização quando:

  • Você precisa isolar instantâneos nessa dependência.

  • Você quer que as atualizações downstream sejam coordenadas com as tabelas dinâmicas upstream e, se necessário, com as atualizações em cascata.

  • Você depende das relações de atraso no destino globais em todo o pipeline.