
Materialization, incremental, and snapshot for events and customer state
Materialization strategies in dbt to balance cost, freshness, and historical data.
What you will learn
- Scegliere la materializzazione giusta tra view, table, incremental ed ephemeral
- Configurare un modello incremental con strategia append, merge o insert_overwrite
- Limitare la finestra dati in sviluppo per contenere i costi del warehouse
Materialization, incremental, and snapshot for events and customer state
Questa lezione appartiene al binario ml-tabellare: ragioniamo su tabelle, righe e aggregazioni, e su come farle costare il giusto. L’argomento è la materializzazione, la scelta che decide dove e quando dbt esegue una trasformazione.
Che cosa decide la materializzazione
La materializzazione decide dove e quando dbt esegue una trasformazione, bilanciando costo di calcolo, freschezza del dato e memoria storica di eventi e stato cliente. In una frase: è la leva che tiene insieme il conto del warehouse e la fiducia nei numeri.
La procedura in cinque passi
- Stima volume e crescita della tabella: fino a pochi milioni di righe resta in ricostruzione piena, oltre conviene il caricamento incrementale.
- Individua un campo affidabile che isola le righe nuove, come la data evento, perché senza di esso il modello incrementale non ha base.
- Se lo stato cliente deve restare interrogabile nel tempo, aggiungi uno snapshot che registra ogni cambiamento con la sua data di validità.
- Limita l’ambiente di sviluppo a una finestra recente, così i test non pagano il prezzo dello storico completo.
- Prevedi una finestra di ricalcolo per gli eventi arrivati in ritardo e un test di completezza che verifichi che la finestra basti.
Le quattro materializzazioni
La tabella riassume i quattro comportamenti disponibili in dbt e indica quando ciascuno conviene.
| Materialization | Behavior | When to use it | Storage | Freshness |
|---|---|---|---|---|
| View | SQL view, no data materialized | Staging, lightweight models | 0 | Always up to date |
| Table | Physical table, rebuilt from scratch | Small/medium models with complex logic | High | Updated at build |
| Incremental | Adds only new rows | Large tables with append-only data | High | Updated at build on new rows |
| Ephemeral | Inline CTE, never materialized | Light intermediate transformations | 0 | Calculated in the consumer query |
Scegli in base a tre criteri: dimensione del modello, frequenza di aggiornamento e costo di una ricostruzione completa.
Incremental: dove ripaga e dove no
Il modello incrementale scala perché carica solo le righe nuove o modificate. Si appoggia a un campo affidabile come event_time che isola le righe da caricare.
Le strategie coprono casi diversi. append aggiunge righe ed è adatta ai dati immutabili. delete+insert cancella e reinserisce le righe esistenti. merge aggiorna e inserisce ed è disponibile su Snowflake e BigQuery. insert_overwrite sovrascrive intere partizioni e conviene sui dati partizionati.
Il cuore della sintassi è il blocco condizionale che filtra i dati solo quando il modello gira in modalità incrementale.
Non sempre vale la pena complicare il modello. Sotto i dieci milioni di righe una tabella ricostruita da zero è più semplice da gestire di un incremental. Se la logica cambia spesso e va riapplicata a tutto lo storico, i continui refresh completi annullano il vantaggio. Se manca un campo affidabile per isolare le righe nuove, manca la base stessa del pattern. Con eventi in ritardo fino a due giorni serve una finestra di ricalcolo esplicita, altrimenti gli arrivi tardivi restano fuori per sempre.
Costi del warehouse sotto controllo
Sul warehouse paghi il calcolo consumato, e il contenimento parte quindi dalle abitudini quotidiane. In sviluppo limita la finestra dati agli ultimi 30 giorni, così non ricostruisci miliardi di righe a ogni prova. Dimensiona il warehouse in base al carico: taglia piccola per i test, taglia grande per la produzione. Disabilita i modelli che nessuno usa più, perché continuano a costare senza generare valore.
References: dbt Labs (2024), Zapier Engineering (2023), Snowflake Documentation (2024).
L’errore che si paga a fine mese
Il fraintendimento più comune è trattare materializzazione, incremental e snapshot come etichette intercambiabili, da applicare per abitudine. Il risultato è un warehouse che costa più del necessario e grafici che non reggono una domanda scomoda.
La prova del nove resta una sola: se il risultato fosse instabile, quale scelta sbaglieresti? Se non sai rispondere, la decisione non è ancora tua.
In sintesi: tabelle piccole in ricostruzione piena, tabelle grandi in incremental con chiave affidabile, stato storico in snapshot; tutto il resto è ottimizzazione prematura.
Verdetto: tabelle piccole in ricostruzione piena, tabelle grandi in incremental con chiave affidabile e stato storico in snapshot; tutto il resto è ottimizzazione prematura.
Il caso Zapier
Zapier ha analizzato i modelli dbt più costosi del suo warehouse e ha convertito a incremental quelli sulle tabelle grandi, aggiungendo timeout alle query lunghe e riducendo la retention degli staging. La spesa mensile legata a dbt è scesa da 28.000 a 11.200 dollari, senza perdita di dati. Il caso, documentato da Zapier Engineering nel 2023, mostra il principio della lezione: la materializzazione giusta si sceglie misurando il costo per modello, non per abitudine.
Domande per metterti alla prova
- Quale materializzazione sceglieresti per una tabella eventi da miliardi di righe e perché?
- Quale campo useresti per isolare le righe nuove in un modello incremental e come verificheresti che sia affidabile?
- Quando uno snapshot è preferibile a un modello incremental per ricostruire lo stato cliente?
- Come gestiresti gli eventi arrivati in ritardo senza ricostruire l’intera tabella?
Bloccato su questo argomento o vuoi applicarlo al tuo caso? Prenota una call di 15 minuti con un analista esperto.
Related Path
Lessons to read together
Questi collegamenti portano la lezione dentro il resto del corso: basi da riprendere, passaggi successivi e connessioni tematiche tra moduli.