Come funziona la cache in Snowflake

Automazione delle pipeline di dati in Snowflake

Emily Melhuish

Technical Curriculum Developer, Snowflake

Tre livelli di cache

Livelli di cache.png

Snowflake memorizza in cache i risultati a tre livelli — ciascuno con ambito e durata diversi

  • Result cache — salva risultati completi e li restituisce senza avviare un warehouse
  • Warehouse o data cache — micro‑partizioni recenti in memoria e SSD
  • Metadata cache — sempre attiva; statistiche tabelle per il planning delle query
Automazione delle pipeline di dati in Snowflake

Quando si usa il Result Cache (e quando no)

Diagramma del Result Cache di Snowflake che mostra una query che restituisce subito un risultato in cache all’utente

Condizione Cache miss quando…
Il testo della query coincide esattamente Differiscono maiuscole, spazi o alias
Nessuna funzione non riutilizzabile funzioni che cambiano a ogni esecuzione: RANDOM
Tabelle sottostanti invariate DML, reclustering o consolidamento dall’ultima esecuzione
Risultato persistito ancora disponibile TTL di 24 ore senza riuso, o 31 giorni
Il ruolo ha i privilegi richiesti SELECT: ruolo senza privilegi SHOW: ruolo diverso
Automazione delle pipeline di dati in Snowflake

Warehouse cache e Metadata cache

Diagramma della data cache di Snowflake che mostra scenari di cache hit e cache miss del warehouse

Warehouse cache

  • Memorizza micro‑partizioni lette di recente su SSD + memoria del warehouse
  • Si svuota quando il warehouse si sospende
  • Imposta auto‑suspend abbastanza lungo da preservare la cache

Metadata cache

  • Sempre attiva, vive in Cloud Services
  • Memorizza statistiche delle tabelle
  • Alcune query rispondono solo dai metadati
Automazione delle pipeline di dati in Snowflake

Pattern SQL che impediscono il partition pruning

Impedisce il pruning:

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

Consente il pruning:

SELECT *
FROM logistics.shipments
WHERE dispatch_date >= '2024-03-01'
  AND dispatch_date <  '2024-04-01';
Automazione delle pipeline di dati in Snowflake

Altri due pattern SQL da evitare

Evita SELECT *

-- Legge tutte le colonne
SELECT * 
FROM logistics.shipments 
WHERE region = 'EMEA';

-- Legge solo il necessario
SELECT shipment_id
, delivery_days 
FROM logistics.shipments 
WHERE region = 'EMEA';

Evita i cross join impliciti

-- Manca la condizione di join = cartesiano
SELECT s.shipment_id
, c.name 
FROM shipments s, carriers c;

-- JOIN esplicito con condizione ON
SELECT s.shipment_id
, c.name 
FROM shipments s 
JOIN carriers c ON s.carrier_id = c.id;
Automazione delle pipeline di dati in Snowflake

Ayo berlatih!

Automazione delle pipeline di dati in Snowflake

Preparing Video For Download...