Le colonne calcolate sono colonne i cui valori vengono generati automaticamente basandosi su altre colonne nella tabella. Il concetto è stato introdotto per semplificare l'accesso ai risultati di calcoli standard, evitando di ripetere le formule in ogni query. Possono essere dichiarate come virtuali (i valori vengono calcolati ad ogni selezione) o materiali (salvati fisicamente all'aggiornamento dei dati).
Il problema è che non tutte le espressioni possono essere calcolate a livello di tabella (limitazioni sui tipi di funzioni), e lo stoccaggio fisico dei dati derivati occupa spazio e richiede aggiornamenti di coerenza durante un UPDATE.
Soluzione: dichiarare le colonne calcolate a livello di DDL, quando possibile, o implementare la logica di aggiornamento tramite trigger/procedure, se è necessario lo stoccaggio o utilizzare aggregati.
Esempio di codice (MS SQL Server):
ALTER TABLE orders ADD total_sum AS (quantity * price); -- virtuale ALTER TABLE orders ADD total_sum_persisted AS (quantity * price) PERSISTED; -- materiale
Caratteristiche chiave:
È possibile creare un indice su una colonna calcolata?
Se la colonna è dichiarata come PERSISTED (salvata fisicamente), è possibile costruire un indice. Per quelle virtuali, non sempre, dipende dal DBMS.
CREATE INDEX ix_total_sum ON orders (total_sum_persisted);
Le colonne calcolate si aggiornano automaticamente quando cambiano le colonne sorgente?
Sì, durante l'inserimento/modifica dei dati sorgente, viene calcolato automaticamente un nuovo valore se la colonna è dichiarata a livello di tabella come calcolata.
Cosa succede se una colonna calcolata si riferisce a NULL?
La maggior parte dei DBMS restituisce NULL se almeno un operando è NULL — è importante gestire i possibili valori NULL tramite COALESCE/ISNULL.
ALTER TABLE orders ADD total_with_discount AS (COALESCE(quantity * price, 0));
Nel database si memorizzano come campi separati il totale prodotto e il prezzo, e separatamente — total. Durante l'aggiornamento del prodotto si dimentica di aggiornare total.
Vantaggi:
Svantaggi:
Il totale finale è dichiarato come colonna virtuale. È sempre preciso, non si discosta dai valori sorgente.
Vantaggi:
Svantaggi: