Perché la storage mode è una decisione architetturale
In Power BI ogni tabella del modello ha una storage mode che decide dove risiedono i dati e come vengono interrogati. È una delle scelte più impattanti sulle performance e sull’esperienza utente: non è un dettaglio di configurazione, ma un compromesso fra velocità, freschezza del dato e volume gestibile. Le tre modalità sono Import, DirectQuery e Dual.
Import: VertiPaq in-memory
In modalità Import i dati vengono copiati dentro il modello e gestiti dal motore VertiPaq, un database analitico columnstore in-memory. VertiPaq non memorizza righe ma colonne compresse: applica dictionary encoding, run-length encoding e value encoding, sfruttando il fatto che una colonna contiene valori omogenei e spesso ripetuti. Il risultato è una compressione elevata e query DAX velocissime, perché l’aggregazione avviene interamente in RAM.
Caratteristiche chiave:
- Prestazioni massime: ideale per dashboard interattive e slicing/dicing rapido.
- DAX completo: nessuna limitazione di funzioni.
- Dati “congelati” al refresh: la freschezza dipende dalla pianificazione del refresh (es. 8 refresh/giorno in capacità Pro, più con Fabric/Premium).
- Limite di dimensione: il modello deve stare in memoria; su capacità condivisa il file ha un tetto (tipicamente 1 GB compresso).
Import è la scelta di default quando il volume è gestibile e non serve il tempo reale.
DirectQuery: query live sulla sorgente
In DirectQuery i dati restano nella sorgente (un data warehouse, Azure SQL, Microsoft Fabric, Databricks, ecc.). Ogni visual genera query SQL inviate live al backend al momento dell’interazione.
Vantaggi e vincoli:
- Dati sempre freschi: nessuna copia, ideale per volumi enormi o requisiti near-real-time.
- Nessun limite di dimensione del modello (i dati non entrano in RAM).
- Più lento: ogni interazione dipende dalla latenza e dal carico della sorgente.
- Limitazioni DAX/M: alcune funzioni time-intelligence e pattern complessi non sono supportati o degradano le performance; il Power Query è ridotto perché deve tradursi in SQL.
DirectQuery si sceglie quando i dati sono troppo grandi per l’import, o quando la governance impone che restino nel database sorgente.
Dual: la tabella camaleonte
Una tabella in Dual si comporta sia come Import sia come DirectQuery, e il motore decide caso per caso quale usare. È pensata per le dimension table condivise in un modello composite: se una query coinvolge solo tabelle Import, Dual serve i dati dalla cache in-memory; se coinvolge una fact table in DirectQuery, Dual si allinea a quest’ultima evitando join costosi tra motori diversi (le cosiddette cross-source query).
Composite model e aggregation table
Un composite model mescola storage mode diverse nello stesso modello: tipicamente fact table enormi in DirectQuery + dimensioni in Dual/Import. Questo permette di combinare freschezza su grandi volumi e reattività sulle dimensioni.
Il vero acceleratore sono le aggregation table: tabelle pre-aggregate (spesso in Import) che rispondono al posto della fact DirectQuery quando la query è a granularità alta.
- L’utente chiede il totale vendite per anno → il motore usa in modo trasparente l’aggregazione in-memory (velocissimo).
- L’utente scende al singolo scontrino → il motore fa fallback in DirectQuery sul dettaglio.
Le aggregazioni si configurano con Manage aggregations mappando le colonne su Count/Sum/Min/Max/GroupBy; l’utente non deve cambiare le sue query.
Criteri di scelta rapidi
- Volume gestibile + no real-time → Import.
- Volumi enormi o dato in tempo reale → DirectQuery, meglio se in composite con aggregazioni.
- Dimensioni condivise in composite → Dual.
Trappole tipiche d’esame
- Serve massima velocità e i dati aggiornati una volta al giorno bastano → Import, non DirectQuery (evita la latenza della sorgente).
- Fact table da miliardi di righe che non entra in memoria, ma serve reattività sui report riepilogativi → composite model DirectQuery + aggregation table in Import.
- In un modello composite, che storage mode dare alle dimension table condivise per evitare query cross-source lente? → Dual.
- Servono dati in tempo reale dal data warehouse aziendale → DirectQuery (Import mostrerebbe dati fermi all’ultimo refresh).
- Una misura DAX time-intelligence non funziona / il report è lento → probabile tabella in DirectQuery: valuta il passaggio a Import o l’uso di aggregazioni, ricordando che VertiPaq offre DAX completo mentre DirectQuery lo limita.