Tabelas dinâmicas

As tabelas dinâmicas são os blocos de construção dos pipelines de transformação de dados declarativos. Eles simplificam significativamente a engenharia de dados no Snowflake e fornecem uma maneira confiável, econômica e automatizada de transformar seus dados para consumo. Em vez de definir as etapas de transformação de dados como uma série de tarefas e depois monitorar as dependências e o agendamento, você pode simplesmente definir o estado final da transformação usando tabelas dinâmicas e deixar o complexo gerenciamento de pipeline por conta do Snowflake.

Este tópico apresenta conceitos de tabela dinâmica e como transformar dados em um pipeline de dados contínuo usando tabelas dinâmicas.

Uma tabela dinâmica materializa os resultados de uma consulta especificada. Em vez de criar uma tabela de destino separada e escrever código para transformar e atualizar os dados nessa tabela, você pode definir a tabela de destino como uma tabela dinâmica e pode especificar a instrução SQL que executa a transformação. Um processo automatizado atualiza os resultados materializados automaticamente por meio de atualizações regulares.

Como o conteúdo de uma tabela dinâmica é totalmente determinado pela consulta fornecida, o conteúdo não pode ser alterado usando DML. Você não insere, atualiza ou exclui as linhas em uma tabela dinâmica. O processo de atualização automatizado materializa os resultados da consulta em uma tabela dinâmica.

Mais sobre esses detalhes posteriormente neste tópico.

As próximas seções explicam os conceitos por trás das tabelas dinâmicas:

Um exemplo

O exemplo em Transformando dados JSON carregados em um cronograma usa fluxos e tarefas para transformar e inserir novos dados em duas tabelas de destino (name e visits) à medida que os dados são transmitidos para uma tabela de aterrissagem (raw).

Os exemplos a seguir demonstram como realizar a mesma transformação usando tabelas dinâmicas.

Instruções SQL para fluxos e tarefas

Instruções SQL para tabelas dinâmicas

-- Create a landing table to store
-- raw JSON data.
CREATE OR REPLACE TABLE raw
  (var VARIANT);

-- Create a stream to capture inserts
-- to the landing table.
CREATE OR REPLACE STREAM rawstream1
  ON TABLE raw;

-- Create a table that stores the names
-- of office visitors from the raw data.
CREATE OR REPLACE TABLE names
  (id INT,
   first_name STRING,
   last_name STRING);

-- Create a task that inserts new name
-- records from the rawstream1 stream
-- into the names table.
-- Execute the task every minute when
-- the stream contains records.
CREATE OR REPLACE TASK raw_to_names
  WAREHOUSE = mywh
  SCHEDULE = '1 minute'
  WHEN
    SYSTEM$STREAM_HAS_DATA('rawstream1')
  AS
    MERGE INTO names n
      USING (
        SELECT var:id id, var:fname fname,
        var:lname lname FROM rawstream1
      ) r1 ON n.id = TO_NUMBER(r1.id)
      WHEN MATCHED AND metadata$action = 'DELETE' THEN
        DELETE
      WHEN MATCHED AND metadata$action = 'INSERT' THEN
        UPDATE SET n.first_name = r1.fname, n.last_name = r1.lname
      WHEN NOT MATCHED AND metadata$action = 'INSERT' THEN
        INSERT (id, first_name, last_name)
          VALUES (r1.id, r1.fname, r1.lname);
Copy
-- Create a landing table to store
-- raw JSON data.
CREATE OR REPLACE TABLE raw
  (var VARIANT);

-- Create a dynamic table containing the
-- names of office visitors from
-- the raw data.
-- Try to keep the data up to date within
-- 1 minute of real time.
CREATE OR REPLACE DYNAMIC TABLE names
  TARGET_LAG = '1 minute'
  WAREHOUSE = mywh
  AS
    SELECT var:id::int id, var:fname::string first_name,
    var:lname::string last_name FROM raw;
Copy

Como mostrado neste exemplo, ao criar uma tabela dinâmica, você especifica a consulta para os resultados que deseja ver. Para a atualização incremental dos dados, você não precisa criar um fluxo para controlar as alterações e escrever uma tarefa para examinar essas alterações e aplicá-las à tabela de destino. O processo de atualização automática faz isso para você, com base na consulta especificada.

Quando usar tabelas dinâmicas

Existem vários métodos de transformação de dados em seu pipeline (por exemplo, fluxos e tarefas, CTAS, sua própria solução personalizada). As tabelas dinâmicas são uma opção para transformar seus dados.

As tabelas dinâmicas são melhor usadas quando:

  • Você não deseja escrever código para rastrear dependências de dados e gerenciar atualização de dados.

  • Você não precisa nem deseja evitar a complexidade de fluxos e tarefas.

  • Você precisa materializar os resultados de uma consulta de várias tabelas de base.

  • Você precisa criar várias tabelas para transformar dados por meio de um pipeline ETL.

  • Você não precisa de um controle minucioso do cronograma de atualização e você deseja apenas especificar a atualização dos dados de destino para seus pipelines.

  • Você não precisa usar construções de consulta dinâmica sem suporte, como procedimentos armazenados, funções não determinísticas não listadas em Funções não determinísticas suportadas em tabelas dinâmicas ou funções externas, ou precisa usar fontes para tabelas dinâmicas que são tabelas externas, fluxos ou exibições materializadas.

Nota

Tabelas dinâmicas podem ser usadas como origem de um fluxo. Quando usados juntos, um fluxo baseado em uma tabela dinâmica funciona como qualquer outro fluxo. Para obter informações adicionais e exemplos, consulte Fluxos e tabelas dinâmicas.

Como funcionam as tabelas dinâmicas

Ao criar uma tabela dinâmica, você especifica a consulta usada para transformar os dados de um ou mais objetos base ou tabelas dinâmicas. Um processo de atualização automatizado executa essa consulta regularmente e atualiza a tabela dinâmica com as alterações feitas nos objetos base.

Comparison between streams / tasks and dynamic tables

Esse processo automatizado calcula as alterações feitas nos objetos base e mescla essas alterações na tabela dinâmica. Para executar este trabalho, o processo usa recursos de computação que você associa à tabela dinâmica. Para obter mais informações sobre recursos, consulte Compreensão dos custos das tabelas dinâmicas.

Ao criar uma tabela dinâmica, você especifica uma meta de “nível de atualização” para os dados (um atraso desejado). Por exemplo, você pode especificar que os dados devem estar no máximo cinco minutos atrasados em relação às atualizações da tabela base. Com base nessa atualização de destino, o processo automatizado configura atualizações para que os dados na tabela dinâmica sejam mantidos atualizados dentro dessa meta (ou seja, dentro de cinco minutos de atualizações na tabela de base).

Se os dados não precisarem ser tão atualizados, você pode especificar um tempo de atualização mais longo para reduzir os custos. Por exemplo, se os dados na tabela de destino precisarem estar no máximo uma hora atrasados em relação às atualizações nas tabelas base, você poderá especificar uma atualização de destino de uma hora (em vez de cinco minutos) para reduzir custos.

Sobre como encadear os pipelines das tabelas dinâmicas

Você pode configurar uma tabela dinâmica para consultar outras tabelas dinâmicas.

Por exemplo, suponha que seu pipeline de dados recupere dados de uma tabela de preparação para atualizar tabelas de dimensão para clientes, produtos e dados de data e hora. Seu pipeline também atualiza uma tabela contendo dados de vendas agregados, com base nas tabelas de dimensão.

Você pode configurar as tabelas de dimensão como tabelas dinâmicas que consultam a tabela de preparação. Você pode configurar a tabela de vendas agregadas como uma tabela dinâmica que consulta as tabelas de dimensão.

Isso é semelhante a definir um gráfico acíclico direcionado (DAG) de tarefas. Em um DAG de tarefas, a tarefa que atualiza a tabela agregada de vendas é executada apenas se as tarefas para atualizar as tabelas de dimensões tiverem sido executadas até a conclusão sem erros.

Comparison between DAGs for streams / tasks and dynamic tables

Se uma tabela dinâmica consultar outra tabela dinâmica, o processo de atualização automática atualizará todas as tabelas dinâmicas dependentes no momento apropriado para garantir que suas metas de atraso sejam atendidas e que os dados sejam consistentes.

Compreensão dos privilégios necessários para tabelas dinâmicas

As seções a seguir explicam os privilégios necessários para criar e trabalhar com tabelas dinâmicas:

Privilégios das tabelas dinâmicas

A tabela a seguir descreve os privilégios necessários para gerenciar tabelas dinâmicas:

Privilégio

Uso

SELECT

Permite executar uma instrução SELECT em uma tabela dinâmica.

OPERATE

Obrigatório para alterar propriedades de uma tabela dinâmica, incluindo:

OWNERSHIP

Concede controle total sobre a tabela dinâmica. Somente uma única função pode ter este privilégio sobre um objeto específico de cada vez.

ALL [ PRIVILEGES ]

Concede todos os privilégios, exceto OWNERSHIP, na tabela dinâmica.

Tabelas dinâmicas e Time Travel

O Snowflake Time Travel permite acessar dados históricos (ou seja, dados que foram alterados ou excluídos) em qualquer ponto de um determinado período. O Time Travel se comporta de forma idêntica para tabelas dinâmicas e tabelas tradicionais.

Para obter mais informações, consulte Snowflake Time Travel e Fail-safe.

Tabelas dinâmicas e replicação

O suporte de replicação para tabelas dinâmicas permite copiar dados de um banco de dados primário para um banco de dados secundário para recuperação de desastres ou compartilhamento de dados. Isso pode servir como uma estratégia de preparação de failover para recuperação de desastres ou como um meio de compartilhar dados entre implantações para fins somente leitura.

As tabelas dinâmicas replicadas se comportam de maneira diferente se o banco de dados primário que contém a tabela dinâmica for replicado em um grupo de replicação ou em um grupo de failover. Para obter mais informações, consulte Replicação e tabelas dinâmicas.