# Colonna virtuale

In informatica, le colonne virtuali sono campi di una tabella di una base di dati il cui valore viene calcolato in base al valore di altre colonne, o di altre espressioni deterministiche. Non fanno parte degli standard SQL e sono implementate solo da alcuni DBMS, come MariaDB, SQL Server e Oracle.
Le colonne virtuali naturalmente non sono compatibili con la normalizzazione dei database, perché creano una ridondanza.

## Implementazione

Le colonne virtuali, nelle varie implementazioni, possono essere di due tipi:
* Virtual
* Persistent
I valori delle colonne Virtual vengono calcolati "al volo" quando è necessario, per esempio quando devono essere restituiti da una query di tipo SELECT. I valori nelle colonne Persistent invece vengono calcolati al momento in cui la riga viene scritta su disco, e scritti insieme a tutti gli altri valori. A seconda dei casi si può preferire un tipo o l'altro: le Virtual non occupano spazio su disco ma richiedono l'elaborazione di un'espressione ad ogni query che le coinvolge; le Persistent invece non richiedono alcun lavoro aggiunto da parte della CPU, ma occupano spazio su disco. Ad ogni modo non è sempre possibile scegliere, perché alcuni DBMS supportano solo un tipo di colonne.

### Le colonne virtuali in MariaDB

MariaDB è un fork di MySQL; nella versione 5.2 sono state aggiunte (fra le altre funzionalità) le colonne virtuali, migliorate in. Al momento, quindi, esse non sono presenti in MySQL.
Le espressioni usate per calcolare i valori sono soggette alle seguenti limitazioni:
* Devono essere deterministiche.
* Non devono essere valori costanti.
* Non possono basarsi su UDF o stored procedure (nemmeno se queste sono deterministiche).
* Non possono basarsi su altre colonne virtuali.
Possono essere indicizzate e possono essere parte di chiavi esterne, tuttavia anche su questo aspetto esistono delle piccole limitazioni.

#### Sintassi

Per creare una colonna virtuale, si utilizza questa sintassi all'interno di un comando CREATE TABLE o ALTER TABLE:
* tipo è il tipo di dato della colonna virtuale.
* espressione è l'espressione SQL usata per calcolare i valori.
* testo è il commento da associare alla colonna (opzionale).

### Le colonne virtuali in Oracle

Le colonne virtuali sono state aggiunte in Oracle a partire dalla versione 11g, release 1.
L'unico tipo di colonne virtuali supportate da Oracle sono le Virtual, pertanto non esiste la possibilità di scrivere tali valori su disco. Per ovviare a questa mancanza, è possibile utilizzare le viste materializzate.

#### Sintassi

Per creare una colonna virtuale, si utilizza la seguente sintassi all'interno di un comando CREATE TABLE o ALTER TABLE:

### SQL Server

SQL Server supporta le colonne virtuali, ma le chiama computed column (colonne calcolate).
L'unico tipo supportato in SQL Server è Persisted, che equivale di fatto a Persistent.

### Strumenti di business intelligence

Negli strumenti di business intelligence come Tableau, Microsoft Power BI o il tabular model di Microsoft Analysis Service le colonne virtuali chiamate colonne calcolate sono essenziali per produrre dati e grafici significativi.

## Alternative alle colonne virtuali

Nei DBMS che non supportano le colonne virtuali, è possibile ottenere funzionalità equivalenti o simili utilizzando:
* le viste, per sostituire le colonne di tipo Virtual;
* le viste materializzate, oppure trigger che riempiono una tabella apposita, per sostituire le colonne Persistent.
Entrambe le soluzioni sono più complesse e meno semplici da mantenere, pertanto si tende a preferire le colonne virtuali se sono supportate.

### Viste

Le viste possono contenere colonne lette direttamente dalle colonne di una tabella e altre colonne calcolate in base a un'espressione SQL. Le viste possono quindi sostituire le colonne di tipo Virtual. Alcuni DBMS supportano le viste materializzate, che possono sostituire le colonne di tipo Persistent, al costo però di duplicare tutti i dati di una tabella, e quindi anche lo spazio occupato sul disco. Inoltre, non esiste una soluzione per simulare sia colonne Persistent sia Virtual all'interno di un'unica vista.

### Trigger

I trigger possono scrivere dati in una tabella subito dopo un'istruzione UPDATE o INSERT; in questo modo, si possono emulare le colonne di tipo Persistent. Questa soluzione è generalmente più lenta, e richiede che vengano mantenuti due trigger (indipendentemente dal numero di colonne che si desidera riempire).

### Indici funzionali

Gli indici funzionali sono una caratteristica di PostgreSQL. Questi sono molto simili alle colonne virtuali e spesso ne sopperiscono la mancanza. Si tratta di indici che non contengono il valore di una tabella (come gli indici normali), ma il valore di un'espressione SQL.