Como o cache funciona no Snowflake

Automação de Pipelines de Dados no Snowflake

Emily Melhuish

Technical Curriculum Developer, Snowflake

Três camadas de cache

Camadas de cache.png

O Snowflake faz cache em três níveis — cada um com escopo e duração diferentes

  • Result cache — armazena resultados completos e retorna sem ligar o warehouse
  • Warehouse/data cache — micro-partições recém-lidas na memória e SSD
  • Metadata cache — sempre ativo; estatísticas de tabela usadas no planejamento
Automação de Pipelines de Dados no Snowflake

Quando o Result Cache é usado (e quando não é)

Diagrama do fluxo do Result Cache do Snowflake mostrando uma consulta retornando resultado em cache instantâneo ao usuário

Condição Falha no cache quando…
Texto da consulta bate exatamente Diferem maiúsculas/minúsculas, espaços ou aliases
Sem funções não reutilizáveis Funções que mudam a cada execução: RANDOM
Tabelas de base inalteradas DML, reclustering ou consolidação desde a última execução
Resultado persistente ainda disponível TTL de 24h sem reuso, ou 31 dias
Função tem privilégios necessários SELECT: função sem privilégios SHOW: função diferente
Automação de Pipelines de Dados no Snowflake

Warehouse cache e Metadata cache

Diagrama do data cache do Snowflake mostrando cenários de acerto e falha no cache do warehouse

Warehouse cache

  • Armazena micro-partições recentes no SSD + memória do warehouse
  • Limpo quando o warehouse suspende
  • Mantenha auto-suspend longo o bastante para preservar o cache

Metadata cache

  • Sempre ativo, no Cloud Services
  • Armazena estatísticas de tabela
  • Algumas consultas respondidas só com metadata
Automação de Pipelines de Dados no Snowflake

Padrões SQL que impedem Partition Pruning

Impede pruning:

SELECT *
FROM logistics.shipments
WHERE MONTH(dispatch_date) = 3;

Permite pruning:

SELECT *
FROM logistics.shipments
WHERE dispatch_date >= '2024-03-01'
  AND dispatch_date <  '2024-04-01';
Automação de Pipelines de Dados no Snowflake

Mais dois padrões SQL para evitar

Evite SELECT *

-- Lê todas as colunas
SELECT * 
FROM logistics.shipments 
WHERE region = 'EMEA';

-- Lê só o necessário
SELECT shipment_id
, delivery_days 
FROM logistics.shipments 
WHERE region = 'EMEA';

Evite cross joins implícitos

-- Sem condição de junção = cartesiano
SELECT s.shipment_id
, c.name 
FROM shipments s, carriers c;

-- JOIN explícito com condição ON
SELECT s.shipment_id
, c.name 
FROM shipments s 
JOIN carriers c ON s.carrier_id = c.id;
Automação de Pipelines de Dados no Snowflake

Vamos praticar!

Automação de Pipelines de Dados no Snowflake

Preparing Video For Download...