Oltre la Tabella: Guida Tecnica a OLAP, OLTP e l’Anatomia dei Cubi Multidimensionali

Nel mondo della gestione dei dati esiste una linea di demarcazione netta che separa due necessità fondamentali: la scrittura ultra-rapida dei dati e la loro lettura analitica su scala massiva. Questa separazione si riflette in due paradigmi architetturali: OLTP (Online Transaction Processing) e OLAP (Online Analytical Processing). 

Se per un database OLTP la tabella normalizzata è la colonna vertebrale, per un sistema OLAP il sovrano indiscusso è il Cubo (o Hypercube). In questo articolo analizzeremo cosa sono i cubi OLAP, perché dal punto di vista matematico e logico non sono altro che query SQL aggregate e pre-calcolate, e come si costruiscono concretamente. 


1. OLTP vs OLAP: Due Mondi Antitetici

Prima di entrare nei dettagli del codice, è fondamentale capire perché abbiamo bisogno di entrambi i sistemi. 

CaratteristicaOLTP (Online Transaction Processing)OLAP (Online Analytical Processing)
Scopo principaleGestire transazioni operative in tempo reale (Scrittura/Modifica).Supportare la Business Intelligence e l’analisi (Lettura).
Design dei DatiAltamente normalizzato (3NF) per evitare ridondanze.Denormalizzato (Star o Snowflake Schema) per ottimizzare i JOIN.
Tipo di QuerySemplici, puntuali, basate su chiavi primarie (INSERT, UPDATE).Complesse, aggregazioni massive (SUM, AVG, GROUP BY).
VelocitàMillisecondi per singola transazione.Da secondi a minuti per miliardi di righe.

Esempio pratico: Quando acquisti un libro su un e-commerce, un database OLTP scrive una riga nella tabella Ordini. Quando il CFO della stessa azienda vuole sapere il trend delle vendite degli ultimi 5 anni diviso per categoria e regione, interroga un sistema OLAP. 


2. Cos’è un Cubo OLAP?

Un Cubo OLAP è una struttura dati multidimensionale ottimizzata per l’analisi rapida dei dati. Nonostante il nome “cubo” suggerisca 3 dimensioni, un cubo OLAP può averne N (in questo caso si parla di ipercubo). 

Un cubo si fonda su due concetti chiave: 

  • Misure (Measures): I dati numerici quantificabili che vogliamo analizzare (es. Fatturato, Quantità Vendute, Costi).
  • Dimensioni (Dimensions): I vettori o attributi di contesto attraverso cui vogliamo filtrare o aggregare le misure (es. Tempo, Geografia, Prodotto). 

Un esempio tridimensionale

Immaginiamo un cubo di vendita con 3 dimensioni: 

  1. Tempo (Gennaio, Febbraio, Marzo)
  2. Prodotto (Laptop, Smartphone, Tablet)
  3. Geografia (Milano, Roma, Napoli) 

Ogni singola cella all’interno di questo spazio tridimensionale conterrà il valore aggregato (la misura), ad esempio: Fatturato dei Laptop venduti a Milano nel mese di Gennaio. 


3. Perché il Cubo OLAP è una “Query Aggregata” in SQL?

Per un programmatore SQL, il modo più semplice di comprendere un cubo OLAP è pensarlo come il risultato di una query di aggregazione mastodontica memorizzata fisicamente in memoria o su disco. 

Se volessimo calcolare tutte le possibili combinazioni di aggregazione per le nostre tre dimensioni in SQL tradizionale, dovremmo scrivere una query complessa utilizzando l’operatore CUBE (introdotto nello standard SQL-99). 

Ecco il codice SQL di esempio: 

sql

SELECT 
    t.Mese,
    p.Categoria,
    g.Citta,
    SUM(f.PrezzoTotale) AS Fatturato,
    COUNT(f.ID_Vendita) AS UnitaVendute
FROM FactVendite f
JOIN DimTempo t ON f.ID_Tempo = t.ID
JOIN DimProdotto p ON f.ID_Prodotto = p.ID
JOIN DimGeografia g ON f.ID_Geografia = g.ID
GROUP BY CUBE (t.Mese, p.Categoria, g.Citta);

Cosa fa esattamente GROUP BY CUBE?

Questa query non restituisce un semplice raggruppamento. L’operatore CUBE genera l’unione (UNION ALL) di ben

2 alla N combinazioni di raggruppamenti diversi, dove N è il numero di dimensioni. Con 3 dimensioni, genererà 2 alla 3 = 8 livelli di aggregazione: 

  1. (Mese, Categoria, Citta) -> Il massimo dettaglio.
  2. (Mese, Categoria) -> Totale per mese e categoria in tutte le città.
  3. (Mese, Citta)
  4. (Categoria, Citta)
  5. (Mese) -> Totale mensile globale.
  6. (Categoria)
  7. (Citta)
  8. () -> Il totale complessivo di tutto il dataset. 

Un cubo OLAP calcola preventivamente queste combinazioni. Quando l’utente fa un report, il motore OLAP non deve scansionare milioni di righe operando JOIN e SUM, deve solo pescare la cella pre-calcolata. 


4. I Formati dei Cubi: MOLAP, ROLAP e HOLAP

L’architettura fisica di un cubo varia a seconda di come i dati vengono memorizzati ed elaborati: 

MOLAP (Multidimensional OLAP)

I dati sono memorizzati in matrici multidimensionali proprietarie e ottimizzate, non in tabelle relazionali. 

  • Pro: Performance di lettura fulminee grazie al pre-calcolo totale.
  • Contro: Scarsa scalabilità con volumi di dati enormi (data explosion) e lunghi tempi di elaborazione (processing) per aggiornare il cubo. 

ROLAP (Relational OLAP)

Il cubo è virtuale. I dati rimangono in un database relazionale strutturato con schemi a stella (Star Schema) o a fiocco di neve (Snowflake Schema). Il motore ROLAP traduce le richieste dell’utente in query SQL complesse (come quella vista sopra) in tempo reale. 

  • Pro: Altamente scalabile, può gestire Petabyte di dati sfruttando la potenza dei moderni Data Warehouse (es. Snowflake, BigQuery).
  • Contro: Più lento di MOLAP, poiché le query vengono eseguite on-demand. 

HOLAP (Hybrid OLAP)

Combina il meglio dei due mondi. Le aggregazioni di livello superiore (es. totali annuali, più leggeri) sono memorizzate in formato MOLAP per la massima velocità, mentre i dettagli atomici rimangono nel DB relazionale (ROLAP). 


5. Anatomia e Costruzione di un Cubo (Star Schema)

Per costruire un cubo in ambiente ROLAP/MOLAP, dobbiamo prima strutturare il database sorgente secondo lo Schema a Stella (Star Schema). Al centro troviamo la Fact Table (Tabella dei Fatti) e attorno le Dimension Tables (Tabelle delle Dimensioni). 

Definizione del DDL (Data Definition Language)

sql

-- 1. Creazione delle Dimensioni
CREATE TABLE DimTempo (
    ID_Tempo INT PRIMARY KEY,
    Data DATE,
    Mese VARCHAR(20),
    Anno INT
);

CREATE TABLE DimProdotto (
    ID_Prodotto INT PRIMARY KEY,
    NomeProdotto VARCHAR(100),
    Categoria VARCHAR(50)
);

CREATE TABLE DimGeografia (
    ID_Geografia INT PRIMARY KEY,
    Citta VARCHAR(50),
    Regione VARCHAR(50)
);

-- 2. Creazione della Fact Table (Contiene Chiavi Esterne e Misure)
CREATE TABLE FactVendite (
    ID_Vendita INT PRIMARY KEY,
    ID_Tempo INT FOREIGN KEY REFERENCES DimTempo(ID_Tempo),
    ID_Prodotto INT FOREIGN KEY REFERENCES DimProdotto(ID_Prodotto),
    ID_Geografia INT FOREIGN KEY REFERENCES DimGeografia(ID_Geografia),
    Quantita INT,          -- Misura 1
    PrezzoTotale DECIMAL(10,2) -- Misura 2
);

Operazioni sul Cubo: Slice, Dice, Roll-Up e Drill-Down

Una volta popolata questa struttura, i motori OLAP espongono delle API (o linguaggi come MDX o DAX) per navigare il cubo attraverso operazioni logiche: 

  • Slice (Affettamento): Seleziona una singola dimensione. Esempio: Guarda solo i dati dove Regione = 'Lombardia'. 
  • Dice (Dadi): Seleziona un sotto-cubo specificando più dimensioni. Esempio: Prodotti della categoria ‘Electronics’ nel mese di ‘Gennaio’ a ‘Milano’. 
  • Roll-Up (Aggregazione): Passa da un dettaglio profondo a uno più generico (es. passare dai dati giornalieri a quelli mensili). 
  • Drill-Down (Dettaglio): L’operazione opposta al Roll-Up. Scende nel dettaglio (es. da una categoria merceologica ai singoli prodotti hardware). 

Conclusioni

I cubi OLAP rappresentano lo strumento definitivo per superare i colli di bottiglia prestazionali del pattern transazionale OLTP. Sebbene l’avvento dei Modern Data Stack basati su database colonnari e sul cloud (Snowflake, ClickHouse, BigQuery) abbia in parte reso sfumato il confine fisico del MOLAP, il concetto logico di Cubo come astrazione multidimensionale e pre-aggregazione dei dati resta un pilastro fondamentale per qualsiasi Data Engineer. 

Comprendere come mappare concettualmente un cubo su una serie di GROUP BY CUBE in SQL permette di progettare architetture di Business Intelligence flessibili, scalabili e soprattutto incredibilmente performanti. 


Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *