Влияние денормализации на производительность

Денормализация переносит часть стоимости с чтения на запись и согласование. Она полезна не «для скорости вообще», а для конкретного измеренного профиля.

Пример: сумма заказа

В нормализованной модели сумму можно вычислить:

SELECT order_id, SUM(quantity * price) AS total
FROM items
WHERE order_id = 42
GROUP BY order_id;

Если сумма читается часто, а позиции меняются редко, ее можно хранить в orders.total. Тогда каждое изменение позиции обязано согласованно обновлять сумму.

BEGIN;
 
UPDATE items
SET quantity = 3
WHERE id = 100;
 
UPDATE orders
SET total = (
    SELECT SUM(quantity * price)
    FROM items
    WHERE order_id = 42
)
WHERE id = 42;
 
COMMIT;

Это лишь один вариант. При большой нагрузке используют изменение дельтой, очередь перерасчета, materialized view или отдельную read model.

Выигрыш

  • меньше join и агрегаций на горячем чтении;
  • предсказуемая latency;
  • данные можно подготовить в форме ответа API;
  • часть аналитики уходит с OLTP-контура.

Цена

  • write amplification;
  • гонки при параллельном обновлении;
  • более сложный rollback и retry;
  • временная или постоянная рассогласованность;
  • миграции и backfill;
  • необходимость сверки и восстановления проекции.

Синхронно или асинхронно

ПодходПлюсРиск
одна транзакция БДстрогая согласованностьболее дорогая запись и блокировки
триггерправило рядом с даннымискрытая логика и сложность сопровождения
событие/read modelмасштабирование чтенияeventual consistency, дубли и порядок событий
периодический rebuildпростота восстановленияданные между пересчетами устаревают

Чек-лист решения

  • Есть baseline и целевая метрика.
  • Определен источник истины.
  • Повтор события идемпотентен.
  • Есть версия/порядок для конкурирующих изменений.
  • Есть сверка и rebuild.
  • Потребитель понимает допустимую задержку.

Связано: Нормализация денормализация, Транзакции принцип ACID, SQL оценка производительности.

Вопросы

Почему денормализация ускоряет чтение? Результат части join/вычислений подготовлен заранее.

Что становится сложнее? Запись, конкуренция, согласование и восстановление копий.

Можно ли обновлять копию асинхронно? Да, если бизнес допускает eventual consistency и есть идемпотентность.

Что нужно до денормализации? Измеренный bottleneck; иначе сложность добавляется без доказанной пользы.