Obliczane kolumny to kolumny, których wartości są automatycznie formowane na podstawie innych kolumn w tabeli. Koncepcja ta powstała, aby uprościć dostęp do wyników typowych obliczeń, aby nie powtarzać formuł w każdym zapytaniu. Można je deklarować jako wirtualne (wartości są obliczane przy każdym pobraniu) lub materializowane (fizycznie przechowywane przy aktualizacji danych).
Problem polega na tym, że nie dla wszystkich wyrażeń możliwe jest obliczenie na poziomie tabeli (ograniczenia dotyczące typów funkcji), a fizyczne przechowywanie pochodnych danych zajmuje miejsce i wymaga utrzymania aktualności przy UPDATE.
Rozwiązanie: deklarować obliczane kolumny na poziomie DDL, kiedy to możliwe, lub wdrażać logikę aktualizacji przez wyzwalacze/procedury, jeśli wymagane jest przechowywanie lub używać agregatów.
Przykład kodu (MS SQL Server):
ALTER TABLE orders ADD total_sum AS (quantity * price); -- wirtualny ALTER TABLE orders ADD total_sum_persisted AS (quantity * price) PERSISTED; -- materializowany
Kluczowe cechy:
Czy można zbudować indeks na obliczanej kolumnie?
Jeśli kolumna jest zadeklarowana jako PERSISTED (fizycznie przechowywana), można zbudować indeks. Dla wirtualnych — nie zawsze, zależy od DBMS.
CREATE INDEX ix_total_sum ON orders (total_sum_persisted);
Czy obliczane kolumny aktualizują się automatycznie przy zmianie źródłowych kolumn?
Tak, przy wstawianiu/edycji danych źródłowych nowe wartości obliczają się automatycznie, jeśli kolumna jest zadeklarowana na poziomie tabeli jako obliczana.
Co się stanie, jeśli obliczana kolumna odwołuje się do NULL?
Większość DBMS zwraca NULL, jeśli chociaż jeden operand to NULL — należy obowiązkowo obsłużyć możliwą wartość NULL poprzez COALESCE/ISNULL.
ALTER TABLE orders ADD total_with_discount AS (COALESCE(quantity * price, 0));
W bazie danych przechowywane są jako osobne pola suma towaru i cena, oraz osobno — total. Przy aktualizacji towaru zapominają zaktualizować total.
Zalety:
Wady:
Łączna suma jest zadeklarowana jako wirtualna kolumna. Zawsze jest dokładna, nie rozbiega się z wartościami źródłowymi.
Zalety:
Wady: