programowanieData Engineer

Jak zaimplementować automatyczne generowanie i aktualizację obliczanych kolumn (Computed Columns) w SQL? Czym różni się ich deklaracja na poziomie tabeli od obliczeń w zapytaniach i jakie trudności mogą wystąpić?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

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:

  • Wirtualne kolumny zmniejszają nadmiarowość, ale zmniejszają szybkość pobierania.
  • Materializowane automatycznie aktualizują się, ale zajmują miejsce i zasoby.
  • Niektóre wyrażenia są zabronione: nie można używać funkcji niepowtarzalnych ani zapytań podrzędnych w obliczanych kolumnach.

Pytania z podstępem.

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

Typowe błędy i antywzorce

  • Przechowywanie zduplikowanych wartości pochodnych bez potrzeby, co prowadzi do wzrostu objętości.
  • Używanie złożonych, nieindeksowanych wyrażeń, spowalniających pracę.
  • Niespójna aktualizacja, gdy obliczenia są przeniesione na poziom aplikacji, a nie bazy danych.

Przykład z życia

Negatywny przypadek

W bazie danych przechowywane są jako osobne pola suma towaru i cena, oraz osobno — total. Przy aktualizacji towaru zapominają zaktualizować total.

Zalety:

  • Szybkie odczyty

Wady:

  • Niespójność danych, trudności przy przeliczeniu.

Pozytywny przypadek

Łączna suma jest zadeklarowana jako wirtualna kolumna. Zawsze jest dokładna, nie rozbiega się z wartościami źródłowymi.

Zalety:

  • Brak rozbieżności
  • Uproszczenie kodu pracy z bazą danych

Wady:

  • Niewielkie spowolnienie przy skomplikowanych formułach, jeśli obliczeń jest bardzo dużo.