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.
Como o tamanho afeta o desempenho da atualização incremental
Como a localidade afeta o desempenho da atualização incremental
Otimização do desempenho do modo de atualização incremental para tabelas dinâmicas complexas
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');
SELECT * FROM SYSTEM$STREAM_BACKLOG('mystream');
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. |