Вычисляемые столбцы — это колонки, значения которых формируются автоматически на основе других колонок в таблице. Концепция появилась для упрощения доступа к результатам типовых вычислений, чтобы не повторять формулы в каждом запросе. Их можно объявлять как виртуальные (значения вычисляются при каждой выборке) или материальные (физически сохраняются при обновлении данных).
Проблема в том, что не для всех выражений возможно вычисление на уровне таблицы (ограничения по типам функций), а физическое хранение производных данных занимает место и требует поддержки актуальности при UPDATE.
Решение: объявлять вычисляемые столбцы на уровне DDL, когда это возможно, или реализовывать логику обновления через триггеры/процедуры, если требуется хранение или использовать агрегаты.
Пример кода (MS SQL Server):
ALTER TABLE orders ADD total_sum AS (quantity * price); -- виртуальный ALTER TABLE orders ADD total_sum_persisted AS (quantity * price) PERSISTED; -- материальный
Ключевые особенности:
Можно ли построить индекс на вычисляемый столбец?
Если столбец объявлен как PERSISTED (физически сохраняется), индекс строить можно. Для виртуальных — не всегда, зависит от СУБД.
CREATE INDEX ix_total_sum ON orders (total_sum_persisted);
Обновляются ли вычисляемые столбцы автоматически при изменении исходных колонок?
Да, при вставке/редактировании исходных данных вычисляется новое значение автоматически, если столбец объявлен на уровне таблицы как вычисляемый.
Что будет, если вычисляемый столбец ссылается на NULL?
Большинство СУБД возвращают NULL, если хотя бы один операнд NULL — обязательно обрабатывайте возможное NULL-значение через COALESCE/ISNULL.
ALTER TABLE orders ADD total_with_discount AS (COALESCE(quantity * price, 0));
В базе хранятся как отдельные поля сумма товара и цена, и отдельно — total. При обновлении товара забывают актуализировать total.
Плюсы:
Минусы:
Итоговая сумма объявлена виртуальным столбцом. Всегда точна, не расходится с исходными значениями.
Плюсы:
Минусы: