ProgrammatieData Engineer

Hoe implementeer je automatische generatie en update van berekende kolommen (Computed Columns) in SQL? Wat is het verschil tussen hun declaratie op tabelniveau en berekeningen in queries, en welke problemen kunnen zich voordoen?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

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:

  • Virtuele kolommen verminderen redundantie, maar verlagen de snelheid van selectie.
  • Gematerialiseerde worden automatisch bijgewerkt, maar verbruiken ruimte en middelen.
  • Sommige expressies zijn verboden: niet-replicabele functies of subqueries kunnen niet worden gebruikt in berekende kolommen.

Vragen met een valkuil.

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

Typische fouten en anti-patronen

  • Het opslaan van duplicerende afgeleiden waarden zonder noodzaak, wat leidt tot volumegroei.
  • Het gebruik van complexe, niet-indexeerbare expressies die de prestaties vertragen.
  • Inconsistent bijwerken, als berekeningen op applicatieniveau zijn uitgevoerd en niet op databasniveau.

Voorbeeld uit het leven

Negatieve casus

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:

  • Snelle uitlezing

Nadelen:

  • Inconsistentie van gegevens, moeilijkheden bij herberekening.

Positieve casus

Het totaalbedrag is gedeclareerd als een virtuele kolom. Altijd nauwkeurig, komt niet in strijd met de oorspronkelijke waarden.

Voordelen:

  • Geen desynchronisatie
  • Vereenvoudiging van de code voor database-interactie

Nadelen:

  • Onbeduidende vertraging bij complexe formules, als er veel berekeningen zijn.