Como o modo de atualização afeta o desempenho da tabela dinâmica

O modo de atualização real da tabela dinâmica é determinado no momento da criação e é imutável depois. Se não for especificado explicitamente, o modo de atualização será definido como AUTO por padrão, selecionando um modo de atualização com base em vários fatores, como complexidade da consulta ou construções, operadores ou funções incompatíveis.

Para verificar o modo de atualização de suas tabelas dinâmicas, consulte Exibição do modo de atualização de tabela dinâmica.

Dica

Para determinar o melhor modo para seu caso de uso, experimente recomendações automáticas e modos de atualização concretos (completa e incremental). O melhor modo para o desempenho das suas tabelas dinâmicas depende do volume de alterações de dados e da complexidade das consultas. Além disso, testar diferentes modos de atualização com um warehouse dedicado ajuda a isolar custos e melhorar o ajuste de desempenho com base nas cargas de trabalho reais.

Para um comportamento consistente em todas as versões do Snowflake, defina explicitamente o modo de atualização em todas as tabelas de produção. O comportamento do AUTO pode mudar entre as versões do Snowflake, o que pode causar mudanças inesperadas no desempenho se usado em pipelines de produção.

Para obter mais informações, consulte Práticas recomendadas para otimizar o desempenho.

Desempenho do modo de atualização completa

Uma atualização completa executa a consulta e substitui as tabelas dinâmicas pelos resultados. O conteúdo de uma tabela dinâmica é o mesmo, independentemente de o modo de atualização completo ou incremental ser escolhido.

A atualização completa normalmente é usada para consultas ou cargas de trabalho complexas em que a atualização incremental é menos eficiente.

Embora a atualização completa consuma muitos recursos, ela é útil quando é necessário reprocessar todo o conjunto de dados, como em operações incrementais sem suporte ou alterações significativas de dados.

Para otimizar o desempenho da atualização completa, trate-a como qualquer outra consulta do Snowflake, mas lembre-se de que o custo inclui a execução da consulta e a inserção dos resultados, não apenas a execução da consulta.

Desempenho do modo de atualização incremental

Uma atualização incremental se concentra na aplicação de alterações desde a última atualização, tornando-a mais eficiente para grandes conjuntos de dados com pequenas atualizações. O conteúdo de uma tabela dinâmica é o mesmo, independentemente do modo de atualização escolhido.

No entanto, a atualização incremental pode ser mais eficiente em termos de recursos porque ignora o reprocessamento de dados inalterados. A decisão de usar atualização incremental depende das características da sua carga de trabalho, como o volume e a complexidade das alterações, e dos potenciais ganhos de desempenho em termos de velocidade e economia de recurso.

As seções a seguir explicam o que torna uma carga de trabalho adequada para atualização incremental. Se sua carga de trabalho não se enquadrar nas condições descritas nestas seções, tente usar o modo de atualização completa para obter uma eficiência potencialmente melhor.

Para obter informações sobre como otimizar o desempenho da atualização incremental, consulte Desempenho de atualização incremental.

Nota

As recomendações nesta documentação podem mudar com o suporte aprimorado para consultas de atualização incremental e desempenho ao longo do tempo.

Compreensão do desempenho de atualização incremental

Em uma atualização incremental, a maior parte do esforço geralmente é destinada ao cálculo de alterações na tabela dinâmica. Isso depende da consulta e pode ser bastante complexo. Um mal-entendido comum é que uma atualização incremental verifica apenas alterações nas tabelas de origem, não as tabelas de origem em si. Isso pode levar ao equívoco de que uma atualização incremental só deve fazer um trabalho proporcional à quantidade de dados de origem que foram alterados, o que não é verdade. Na realidade, as atualizações incrementais geralmente precisam verificar as tabelas de origem diretamente.

Por exemplo, imagine uma consulta que faça uma junção interna entre as tabelas A e B. Se uma linha for inserida na tabela A, ela deverá ser unida à tabela B para calcular as alterações na consulta. Essa única linha em A pode se juntar a muitas linhas em B, o que pode significar que há muito trabalho, mesmo que haja apenas algumas alterações nas fontes.

Esse trabalho extra pode acontecer com vários operadores. A atualização incremental processa novos dados e ignora o trabalho já feito. Decidir o que ignorar pode exigir trabalho adicional, especialmente para consultas complexas e diferentes operadores podem ignorar o trabalho de diferentes maneiras.

Normalmente, o tamanho das alterações e a localidade afetam a quantidade de trabalho que pode ser ignorada.

Como o tamanho afeta o desempenho da atualização incremental

O fator mais significativo que afeta o desempenho da atualização incremental é o tamanho das alterações nos dados de origem. Ao determinar o tamanho das alterações nas atualizações da tabela dinâmica, certifique-se de incluir as linhas copiadas na contagem. Uma DML que altere algumas linhas em uma micropartição também copia as linhas inalteradas dessa micropartição para uma nova micropartição.

Para analisar o número de linhas alteradas em uma tabela base, crie um fluxo na tabela base no momento da última atualização e use SYSTEM$STREAM_BACKLOG. Por exemplo:

CREATE STREAM mystream ON TABLE mybasetable BEFORE(STATEMENT => 'last refresh UUID');
Copy
SELECT * FROM SYSTEM$STREAM_BACKLOG('mystream');
Copy

Como exemplo extremo, considere o efeito de excluir todos os dados de uma fonte: uma atualização completa vê apenas uma tabela vazia, que pode ser processada muito rapidamente. Por outro lado, uma atualização incremental precisa processar cada linha excluída, o que a torna muito mais lenta.

Desacelerações semelhantes também podem ocorrer em casos menos extremos. Uma boa diretriz para uma carga de trabalho favorável é manter as alterações na origem ou no destino em menos de 5% das linhas.

Como a localidade afeta o desempenho da atualização incremental

O segundo fator que mais afeta a atualização incremental é a localidade, que se refere ao quão intimamente os dados ou ações estão relacionados em diferentes dimensões.

Por exemplo, se você tiver uma tabela com uma coluna de carimbo de data/hora e sempre inserir linhas com a hora atual nessa coluna, sua carga de trabalho terá uma forte localidade entre a ordem de inserção e a coluna de carimbo de data/hora.

A localidade pode aparecer de várias formas, mas algumas são especialmente importantes para a atualização incremental. Melhorar a localidade em qualquer uma das áreas a seguir aumenta o desempenho das atualizações incrementais, embora nem sempre seja possível ter uma localidade forte em todas as três categorias.

Área de localidade

Descrição

Localidade entre chaves de clustering e particionamento.

Ao realizar uma operação de particionamento na definição de tabela dinâmica, é útil que as fontes subjacentes sejam clusterizadas com base nessas chaves de particionamento.

Por exemplo, se você estiver unindo duas tabelas usando um ID, é melhor para o desempenho de atualização incremental se as tabelas forem clusterizadas por suas respectivas colunas de ID.

Localidade entre chaves de particionamento ou agrupamento e alterações na fonte.

O ideal é que as alterações nas fontes tenham apenas uma chave de particionamento em comum com uma pequena fração de linhas na(s) tabela(s) de origem.

Por exemplo, se você estiver inserindo linhas com o carimbo de data/hora atual, agrupar por hora pode funcionar bem devido à forte localidade entre as chaves e as alterações de origem. No entanto, se você estiver inserindo linhas com um valor de coluna que apareça em muitas outras linhas na tabela, o agrupamento por essa coluna resultará em um desempenho de atualização incremental ruim.

Localidade entre alterações na tabela de destino e agrupamento.

Quando uma atualização incremental aplica alterações a uma tabela dinâmica, atualizações e exclusões são unidas ao estado atual da tabela dinâmica. Essa junção tem melhor desempenho se as alterações estiverem alinhadas com o clustering na tabela dinâmica.

Por exemplo, se as atualizações atualizam apenas as linhas inseridas recentemente, elas se alinham bem com o clustering da tabela.

Para obter informações sobre como as tabelas do Snowflake são armazenadas, consulte Explicação das estruturas de tabela do Snowflake. Para gerenciar o clustering em uma tabela, use Clustering automático.

Expectativas de desempenho para atualizações incrementais de operadores individuais

A tabela a seguir mostra as expectativas de desempenho aproximadas para atualizações incrementais de operadores individuais. O desempenho é medido em relação a uma atualização completa, supondo que apenas 5% das linhas foram alteradas e que os trabalhos de atualização levam pelo menos 1 minuto.

Nota

Devido a sobrecargas (por exemplo, otimização de consultas, agendamento de warehouse e limpeza de tarefas) que não aceleram com a otimização de consultas, consultas curtas (menos de 10 segundos) podem apresentar ganhos de desempenho menores.

Operador

Aumento de desempenho

SELECT

10 ×

WHERE

10 ×

FROM

10 ×

UNION ALL

10 ×

Agregados escalares

10 ×

Para operadores afetados pela localidade, a tabela mostra as expectativas de desempenho com localidade boa e ruim. Observe que, para alguns operadores, uma localidade ruim pode levar a um desempenho pior do que atualizações completas.

Operador

Localidade

Aumento de desempenho

GROUP BY

Boa

5 ×

GROUP BY

Ruim

1/3 ×

DISTINCT

Boa

5 ×

DISTINCT

Ruim

1/4 ×

OVER

Boa

2 a 5 ×

OVER

Ruim

1/5 ×

INNER JOIN

Boa

10 ×

INNER JOIN

Ruim

2 ×

OUTER JOIN

Boa

3 ×

OUTER JOIN

Ruim

0,1 ×

Para obter mais informações, consulte Como os operadores atualizam incrementalmente.

Otimização do desempenho do modo de atualização incremental para tabelas dinâmicas complexas

Tabelas dinâmicas geralmente contêm vários operadores, tornando mais difícil prever seu desempenho com atualizações incrementais. Esta seção explora como lidar com esse desafio e fornece algumas dicas para melhorar o desempenho de tabelas dinâmicas complexas.

Quando há vários operadores envolvidos, as atualizações incrementais calculam as alterações trabalhando em cada operador separadamente, transformando-o em um fragmento de um plano de consulta que pode calcular alterações com base em suas entradas. Para cada entrada, esse novo fragmento pode solicitar a entrada antes das alterações, depois das alterações ou apenas as alterações em si. Ao aplicar esse processo a cada operador na consulta original, você obtém um novo plano de consulta que calcula alterações usando uma combinação de verificações de alteração e verificações de tabela completas. Este plano é otimizado pelo otimizador de consultas do Snowflake e executado como qualquer outra consulta.

Quando uma atualização incremental não tem um bom desempenho, geralmente é porque há muitas alterações ou a localidade é ruim. Consultas complexas dificultam ainda mais a identificação desses problemas. O desempenho dos operadores incrementais geralmente depende da quantidade de alterações e da localidade de suas entradas. No entanto, essas entradas são as saídas de outros operadores, portanto, a quantidade e a localidade dos dados podem mudar à medida que eles passam pelos operadores.

Portanto, entender o desempenho de uma atualização incremental complexa requer considerar a entrada de cada operador separadamente. Aqui estão alguns cenários comuns e sugestões para lidar com eles:

Cenário

Recomendação

Você está unindo tabelas em várias colunas, então não pode usar CLUSTER BY em todas elas simultaneamente.

Priorize o agrupamento de tabelas maiores por chaves que mudam com frequência. Por exemplo, em um esquema em estrela com uma grande tabela de dimensões, concentre-se em clusterizar a tabela de dimensões.

Considere criar várias cópias do mesmo conjunto de dados, cada uma clusterizada por chaves diferentes, e usá-las em contextos relevantes.

Você tem um GROUP BY ou OVER em muitas junções.

Garanta que as tabelas de origem estejam clusterizadas por chaves de agrupamento/particionamento e considere dividir as junções e agregações em duas tabelas dinâmicas separadas.

Observe que junções externas interagem mal com agregações.