SELECTSELECT

SELECT

Micro-partitions: entenda a estrutura de arquivos do Snowflake

By Niall WoodwardNov 2, 20226 min read

Esta página também está disponível em English, Deutsch, Español, Français, Italiano e 日本語.

Computação e armazenamento escaláveis de forma independente são um dos pilares da arquitetura do Snowflake. Neste post, vamos mostrar como o Snowflake armazena dados e como isso pode acelerar bastante o desempenho das consultas.

Uma revisão rápida da arquitetura do Snowflake

Em um post anterior, falamos sobre como a arquitetura do Snowflake é dividida em três camadas horizontais. Primeiro, existe a camada de cloud services, uma categoria bem ampla que reúne todos os recursos do Snowflake fora da execução de consultas. A camada de cloud services interage com a camada de processamento de consultas massivamente paralelo. Os virtual warehouses dessa camada leem e gravam dados na camada de armazenamento, que é o S3 para a maior parte dos clientes Snowflake (a maioria das contas Snowflake roda na AWS). É nessa camada de armazenamento que ficam as micro-partitions.

Overview of Snowflake's architecture

Micro-partitions, partitioning, clustering — afinal, o que significa cada um?

Para complicar, existem vários termos parecidos, mas com significados diferentes, ligados às micro-partitions. Veja um glossário:

  1. Micro-partitions (o foco deste post) — a unidade de armazenamento do Snowflake. Em termos simples, uma micro-partition é um tipo específico de arquivo. Às vezes são chamadas apenas de partitions.
  2. Clustering — descreve a distribuição dos dados entre as micro-partitions de uma determinada tabela.
  3. Clustered — todas as tabelas são clustered no sentido de que os dados ficam armazenados em uma ou mais micro-partitions, mas a documentação do Snowflake define o termo assim: "Uma tabela com uma clustering key definida é considerada clustered."
  4. Well-clustered — descreve uma tabela que faz um bom pruning para as consultas típicas executadas sobre ela. Mas atenção: uma tabela well-clustered não é necessariamente clustered segundo a definição acima.
  5. Clustering key — uma clustering key (ou expressão) pode ser definida para uma tabela, ativando o serviço de clustering automático do Snowflake. Esse serviço é um processo serverless cobrado à parte, que reorganiza os dados nas micro-partitions conforme a clustering key especificada.
  6. Partitioning — partitioning não tem uma definição própria dentro do contexto do Snowflake.
  7. Warehouse cluster — a unidade de escala em um warehouse multi-clustered.

O que é uma micro-partition do Snowflake?

Uma micro-partition é um arquivo armazenado no serviço de blob storage do provedor de nuvem em que a conta Snowflake roda:

  • AWS — S3
  • Azure — Azure Blob Storage
  • GCP — Google Cloud Storage

As micro-partitions usam um formato de arquivo proprietário e fechado criado pelo Snowflake. Elas têm um cabeçalho com metadados que descrevem os dados armazenados, e os dados em si ficam agrupados por coluna e guardados em formato comprimido.

Uma única micro-partition pode conter até 16MB de dados comprimidos (é daí que vem a mesma restrição do tipo variant), o que, sem compressão, costuma ficar entre 50 e 500MB. Tabelas pequenas (<500MB sem compressão) podem ter apenas uma micro-partition e, como o Snowflake não impõe limite de tamanho para tabelas, também não há limite para o número de micro-partitions que uma tabela pode ter.

Uma micro-partition sempre contém linhas completas de dados. Isso pode causar confusão, já que as micro-partitions também são um formato colunar de armazenamento. Mas esses dois atributos não se contradizem: é possível recuperar colunas individuais de uma micro-partition. Você vai ver as micro-partitions sendo descritas como 'colunar híbrido', justamente porque agrupam os dados tanto por linhas (a micro-partition) quanto por colunas (dentro de cada micro-partition).

Ok, chega de teoria, hora de um diagrama. Ao longo do post, vamos usar como exemplo uma tabela de pedidos (orders). Veja como é uma das micro-partitions armazenadas para essa tabela:

The anatomy of a Snowflake micro-partition

No cabeçalho ficam guardados os intervalos de bytes de cada coluna dentro da micro-partition, o que permite ao Snowflake recuperar apenas as colunas relevantes para uma consulta usando um byte range get. É por isso que as consultas ficam mais rápidas quando você reduz o número de colunas selecionadas.

Os metadados de cada coluna da micro-partition são armazenados pelo Snowflake em seu metadata cache na camada de cloud services. Esses metadados são usados para entregar resultados extremamente rápidos em consultas analíticas básicas, como count(*) e max(column). Há também metadados adicionais que não aparecem aqui, alguns deles não documentados, descritos pelo Snowflake como 'usados tanto para otimização quanto para processamento eficiente de consultas'.

Metadata for a single Snowflake micro-partition

Os valores mínimo e máximo são fundamentais, porque dão ao Snowflake a capacidade de fazer pruning.

O que é query pruning no Snowflake?

Resumo