ProgrammazioneData Engineer

Come implementare la generazione automatica e l'aggiornamento delle colonne calcolate (Computed Columns) in SQL? Qual è la differenza tra la loro dichiarazione a livello di tabella e i calcoli nelle query, e quali difficoltà possono sorgere?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

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:

  • Le colonne virtuali riducono la ridondanza, ma rallentano la velocità di selezione.
  • Quelle materializzate si aggiornano automaticamente, ma consumano spazio e risorse.
  • Alcune espressioni sono vietate: non è possibile utilizzare funzioni non replicabili o sottoquery nelle colonne calcolate.

Domande insidiose.

È 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));

Errori comuni e anti-pattern

  • Memorizzare valori derivati duplicati senza necessità, con conseguente aumento di volume.
  • Utilizzare espressioni complesse e non indicizzabili, che rallentano le prestazioni.
  • Aggiornamenti incoerenti, se i calcoli sono portati a livello di applicazione piuttosto che di database.

Esempio dalla vita reale

Caso negativo

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:

  • Lettura rapida

Svantaggi:

  • Incoerenza dei dati, difficoltà nel ricalcolo.

Caso positivo

Il totale finale è dichiarato come colonna virtuale. È sempre preciso, non si discosta dai valori sorgente.

Vantaggi:

  • Nessuna disallineamento
  • Semplificazione del codice di interazione con il database

Svantaggi:

  • Leggero rallentamento con formule complesse, se ci sono molti calcoli.