Berekende kolommen zijn kolommen waarvan de waarden automatisch worden gegenereerd op basis van andere kolommen in de tabel. Het concept is ontstaan om de toegang tot de resultaten van standaardberekeningen te vereenvoudigen, zodat formules niet in elke query hoeven te worden herhaald. Ze kunnen worden gedeclareerd als virtueel (waarden worden berekend bij elke selectie) of gematerialiseerd (fysiek opgeslagen bij het bijwerken van gegevens).
Het probleem is dat niet voor alle expressies berekening op tabelniveau mogelijk is (beperkingen van functie types), en fysiek opslaan van afgeleide gegevens kost ruimte en vereist actualisering bij UPDATE.
Oplossing: declareer berekende kolommen op DDL-niveau wanneer mogelijk, of implementeer de update-logica via triggers/procedures als opslag vereist is of gebruik aggregaten.
Voorbeeld code (MS SQL Server):
ALTER TABLE orders ADD total_sum AS (quantity * price); -- virtueel ALTER TABLE orders ADD total_sum_persisted AS (quantity * price) PERSISTED; -- gematerialiseerd
Kernpunten:
Kan een index worden gebouwd op een berekende kolom?
Als de kolom is gedeclareerd als PERSISTED (fysiek opgeslagen), kan een index worden gebouwd. Voor virtuele kolommen geldt dit niet altijd, afhankelijk van de DBMS.
CREATE INDEX ix_total_sum ON orders (total_sum_persisted);
Worden berekende kolommen automatisch bijgewerkt bij wijziging van de oorspronkelijke kolommen?
Ja, bij invoer/bewerking van de oorspronkelijke gegevens wordt automatisch een nieuwe waarde berekend als de kolom op tabelniveau als berekend is gedeclareerd.
Wat gebeurt er als een berekende kolom naar NULL verwijst?
De meeste DBMS geven NULL terug als tenminste één operand NULL is — zorg ervoor dat je mogelijke NULL-waarden behandelt via COALESCE/ISNULL.
ALTER TABLE orders ADD total_with_discount AS (COALESCE(quantity * price, 0));
In de database worden de som van het product en de prijs als aparte velden opgeslagen, en afzonderlijk — total. Bij het bijwerken van het product vergeten ze total te actualiseren.
Voordelen:
Nadelen:
Het totaalbedrag is gedeclareerd als een virtuele kolom. Altijd nauwkeurig, komt niet in strijd met de oorspronkelijke waarden.
Voordelen:
Nadelen: