Otimização do desempenho do armazenamento

Este tópico discute as otimizações de armazenamento que podem melhorar o desempenho da consulta, como o armazenamento de dados semelhantes juntos, a criação de estruturas de dados otimizadas e a definição de conjuntos de dados especializados. O Snowflake oferece três dessas estratégias de armazenamento: clustering automático, otimização de pesquisa e exibições materializadas.

Em geral, essas estratégias de armazenamento não melhoram substancialmente o desempenho das consultas que já são executadas em um segundo ou mais rapidamente.

As estratégias discutidas neste tópico são apenas uma maneira de melhorar o desempenho das consultas. Para estratégias relacionadas aos recursos de computação usados para executar uma consulta, consulte Otimização de warehouses quanto ao desempenho.

Introdução às estratégias de armazenamento

Clustering automático

O Snowflake armazena os dados de uma tabela em micropartições. Entre essas micropartições, o Snowflake organiza (ou seja, agrupa) os dados com base nas dimensões dos dados. Se uma consulta filtrar, juntar ou agregar essas dimensões, menos micropartições deverão ser examinadas para retornar os resultados, o que acelera consideravelmente a consulta.

Você pode definir uma chave de cluster para alterar a organização padrão das micropartições, de modo que os dados sejam clusterizados em torno de dimensões específicas (ou seja, colunas). A escolha de uma chave de cluster melhora o desempenho das consultas que filtram, juntam ou agregam por colunas definidas na chave de cluster.

O Snowflake ativa o clustering automático para manter o clustering da tabela assim que você define uma chave de cluster. Uma vez ativado, o clustering automático atualiza as micropartições à medida que novos dados são adicionados à tabela. Saiba mais

Serviço de otimização de pesquisa

O Serviço de otimização de pesquisa melhora o desempenho de consultas de pesquisa pontual (ou seja, «pesquisas de agulha em um palheiro») que retornam um pequeno número de linhas de uma tabela usando filtros altamente seletivos. O Serviço de otimização de pesquisa é ideal quando é essencial ter consultas de pesquisa pontual de baixa latência (por exemplo, pesquisas de registros investigativos, detecção de ameaças ou anomalias e painéis críticos com filtros seletivos).

O Serviço de otimização de pesquisa reduz a latência das consultas de pesquisa pontual criando uma estrutura de dados persistente que é otimizada para um tipo específico de pesquisa.

Você pode ativar o Serviço de otimização de pesquisa para uma tabela inteira ou para colunas específicas. Desde que sejam suficientemente seletivas, as pesquisas de igualdade, subcadeia de caracteres e geo nessas colunas podem ser aceleradas significativamente.

O Serviço de otimização de pesquisa é compatível com dados estruturados e semiestruturados (consulte tipos de dados compatíveis).

O Serviço de otimização de pesquisa requer o Snowflake Enterprise Edition ou versão superior. Saiba mais

Exibições materializadas

Uma exibição materializada é um conjunto de dados pré-computados derivado de uma instrução SELECT que é armazenada para uso posterior. Como os dados são pré-calculados, consultar uma exibição materializada é mais rápido do que executar uma consulta em uma tabela de base na qual a exibição está definida. Por exemplo, se você especificar SELECT SUM(column1) ao criar a exibição materializada, uma consulta que retorna SUM(column1) da exibição será executada mais rapidamente porque column1 já foi agregado.

As exibições materializadas são projetadas para melhorar o desempenho da consulta para cargas de trabalho compostas por padrões de consulta comuns e repetidos que retornam um pequeno número de linhas e/ou colunas em relação à tabela base.

Uma exibição materializada não pode se basear em mais de uma tabela.

As exibições materializadas exigem o Snowflake Enterprise Edition ou superior. Saiba mais

Como escolher uma estratégia de otimização

Diferentes tipos de consultas se beneficiam de diferentes estratégias de armazenamento. Você pode usar as seções a seguir para descobrir qual estratégia é mais adequada para uma carga de trabalho.

O clustering automático é a opção mais abrangente que pode trazer vantagens para uma série de consultas que acessam as mesmas colunas de uma tabela. Um administrador geralmente escolhe as consultas mais importantes com base nos requisitos de frequência e latência e, em seguida, escolhe uma chave de cluster que maximiza o desempenho dessas consultas. O clustering automático faz sentido quando muitas consultas filtram, juntam ou agregam as mesmas poucas colunas.

O Serviço de otimização de pesquisa e as exibições materializadas têm um escopo mais restrito. Quando consultas específicas acessam um subconjunto bem definido dos dados de uma tabela, o administrador pode usar as características da consulta para decidir se o uso do Serviço de otimização de pesquisa ou de uma exibição materializada pode melhorar o desempenho. Por exemplo, os administradores podem identificar consultas de pesquisa de pontos importantes e implementar o Serviço de otimização de pesquisa para uma tabela ou coluna. Da mesma forma, o administrador pode otimizar padrões de consulta específicos criando uma exibição materializada.

É possível implementar mais de uma dessas estratégias em uma tabela, e uma consulta individual com vários filtros pode se beneficiar tanto do clustering automático quanto do Serviço de otimização de pesquisa. No entanto, ativar o Serviço de otimização de pesquisa ou criar uma exibição materializada em uma tabela clusterizada pode ser mais caro. Para saber por que isso aumenta os custos de computação, consulte Custos contínuos (neste tópico).

Se mais de uma estratégia puder melhorar o desempenho de uma determinada consulta, talvez você queira começar com o clustering automático ou o Serviço de otimização de pesquisa, pois outras consultas com padrões de acesso semelhantes também poderão ser melhoradas.

Como diferenciar as considerações

O texto a seguir não é uma comparação exaustiva das estratégias de armazenamento, mas fornece as considerações mais importantes ao diferenciá-las.

Clustering automático:
  • O maior aumento de desempenho vem de uma cláusula WHERE que filtra em uma coluna da chave do cluster, mas também pode melhorar o desempenho de outras cláusulas e funções que atuam na mesma coluna (por exemplo, junções e agregações).

  • Ideal para consultas de intervalo ou consultas com um filtro de desigualdade. Também melhora um filtro de igualdade, mas o Serviço de otimização de pesquisa geralmente é mais rápido para consultas de pesquisa de pontos.

  • Disponível na Standard Edition do Snowflake.

  • Só pode haver uma chave de cluster. [1] Se consultas diferentes em uma tabela atuarem em colunas diferentes, considere usar o Serviço de otimização de pesquisa ou uma exibição materializada.

Serviço de otimização de pesquisa:
  • Aprimora as consultas de pesquisa de ponto que retornam um pequeno número de linhas. Se a consulta retornar mais do que alguns registros, considere o clustering automático.

  • Inclui suporte para consultas de pesquisa de ponto que:

    • Faz a correspondência de subcadeias de caracteres ou expressões regulares usando predicados como LIKE e RLIKE.

    • Pesquisa campos específicos nas colunas VARIANT, ARRAY ou OBJECT.

    • Usa funções geoespaciais com valores GEOGRAPHY.

Exibição materializada:
  • Melhora os cálculos intensivos e frequentes, como agregação e análise de dados semiestruturados (não apenas filtragem).

  • Normalmente, concentra-se em um cálculo específico de consulta/subconsulta.

  • Aprimora as consultas em tabelas externas.

[1] Se houver um motivo importante para definir várias chaves de cluster, você poderá criar várias exibições materializadas, cada uma com sua própria chave de cluster.

Consultas prototípicas

Os exemplos a seguir têm o objetivo de destacar qual tipo de consulta normalmente é executado mais rapidamente com uma determinada estratégia de armazenamento.

Consulta prototípica para clustering

O clustering automático oferece um aumento de desempenho para consultas de intervalo com varreduras de tabelas grandes. Por exemplo, a consulta a seguir será executada mais rapidamente se a coluna shipdate for a chave de cluster da tabela, porque a cláusula WHERE faz a varredura de muitos dados.

SELECT
  SUM(quantity) AS sum_qty,
  SUM(extendedprice) AS sum_base_price,
  AVG(quantity) AS avg_qty,
  AVG(extendedprice) AS avg_price,
  COUNT(*) AS count_order
FROM lineitem
WHERE shipdate >= DATEADD(day, -90, to_date('2023-01-01));
Copy

Para obter um exemplo adicional de uma consulta que poderia ser executada mais rapidamente se a tabela estivesse clusterizada, consulte Benefícios da definição de chaves de clustering (para tabelas muito grandes).

Consulta prototípica para otimização de pesquisa

O Serviço de otimização de pesquisa pode aumentar o desempenho de consultas de pesquisa de ponto que examinam uma tabela grande para retornar um pequeno subconjunto de registros. Por exemplo, a consulta a seguir será executada mais rapidamente com o Serviço de otimização de pesquisa se a coluna sender_ip tiver um grande número de valores distintos.

SELECT error_message, receiver_ip
FROM logs
WHERE sender_ip IN ('198.2.2.1', '198.2.2.2');
Copy

Para analisar outras consultas que podem ser executadas mais rapidamente com o Serviço de otimização de pesquisa, consulte os exemplos a seguir:

Consulta prototípica para exibição materializada

Uma exibição materializada pode proporcionar um aumento de desempenho para consultas que acessam um pequeno subconjunto de dados usando operações caras, como agregação. Como exemplo, suponha que um administrador tenha agregado a coluna totalprice ao criar uma exibição materializada mv_view1. A consulta a seguir na exibição materializada será executada mais rapidamente do que na tabela base.

SELECT
  orderdate,
  SUM(totalprice)
FROM mv_view1
GROUP BY 1;
Copy

Para obter mais casos de uso em que as exibições materializadas podem acelerar as consultas, consulte Exemplos de casos de uso para exibições materializadas.

Considerações sobre implementação e custos

Esta seção discute as considerações de custo do uso de uma estratégia de armazenamento para melhorar o desempenho da consulta, juntamente com as considerações de implementação para equilibrar custo e desempenho.

Investimento inicial

A implementação de uma estratégia de armazenamento pode exigir um compromisso de tempo e um investimento financeiro inicial maiores do que outros tipos de otimizações de desempenho (por exemplo, reescrever instruções SQL ou otimizar o warehouse que executa a consulta), mas as melhorias de desempenho podem ser significativas.

O Snowflake usa recursos de computação sem servidor para implementar cada estratégia de armazenamento, o que consome créditos antes que você possa testar se a otimização melhora o desempenho. Além disso, o Snowflake pode levar um tempo significativo para implementar totalmente o clustering automático e o Serviço de otimização de pesquisa (por exemplo, uma semana para uma tabela muito grande).

O Serviço de otimização de pesquisa e as exibições materializadas também exigem a versão Enterprise Edition ou superior, o que aumenta o preço de um crédito.

Custo contínuo

As estratégias de armazenamento incorrem em custos de computação e armazenamento.

Custos computacionais

O Snowflake usa recursos de computação sem servidor para manter as otimizações de armazenamento à medida que novos dados são adicionados a uma tabela. Quanto mais alterações forem feitas em uma tabela, maiores serão os custos de manutenção. Se uma tabela for atualizada constantemente, o custo de manter uma otimização de armazenamento poderá ser impeditivo.

O custo de manutenção de exibições materializadas ou do Serviço de otimização de pesquisa pode ser significativo quando o clustering automático está ativado para a tabela subjacente. Com o clustering automático, o Snowflake está constantemente fazendo o reclustering de suas micropartições em torno das dimensões da chave de clustering. Toda vez que a tabela de base é reclusterizada, o Snowflake precisa usar recursos de computação sem servidor para atualizar o armazenamento usado pelas exibições materializadas e pelo Serviço de otimização de pesquisa. Como resultado, as atividades de clustering automático na tabela de base podem acionar custos de manutenção para exibições materializadas e o Serviço de otimização de pesquisa além do custo dos comandos DML na tabela de base.

Custo de armazenamento
Clustering automático

Ao contrário do Serviço de otimização de pesquisa e das exibições materializadas, o clustering automático reorganiza os dados existentes em vez de criar armazenamento adicional. No entanto, o reclustering pode gerar custos adicionais de armazenamento se aumentar o tamanho do armazenamento Fail-safe. Para obter mais detalhes, consulte Impacto do reclustering no crédito e no armazenamento.

Otimização de pesquisa / Exibições materializadas

As exibições materializadas e o Serviço de otimização de pesquisa incorrem no custo de armazenamento adicional, que é cobrado de acordo com a taxa padrão.

Estimativa de custos

Serviço de otimização de pesquisa

Você pode executar a função SYSTEM$ESTIMATE_SEARCH_OPTIMIZATION_COSTS para ajudar a estimar o custo de adicionar o Serviço de otimização de pesquisa a uma coluna ou a uma tabela inteira. Os custos estimados são proporcionais ao número de colunas que serão ativadas e ao quanto a tabela foi alterada recentemente.

Estratégia de implementação

Como os custos de computação e os custos de armazenamento de uma estratégia de armazenamento podem ser significativos, talvez seja melhor começar aos poucos e monitorar cuidadosamente os custos iniciais e contínuos antes de se comprometer com uma implementação mais extensa. Por exemplo, você pode escolher uma chave de cluster para apenas uma ou duas tabelas e, em seguida, avaliar o custo antes de escolher uma chave para outras tabelas.

Ao acompanhar o custo contínuo associado a uma estratégia de armazenamento, lembre-se de que os warehouses virtuais consomem créditos somente durante o tempo em que estão executando uma consulta, portanto, uma consulta mais rápida custa menos para ser executada. A Snowflake recomenda relatar cuidadosamente o custo de execução de uma consulta antes da otimização do armazenamento e compará-lo com o custo de execução da mesma consulta após a otimização do armazenamento, para que possa ser levado em conta na avaliação de custos.