Влияние денормализации на производительность
Денормализация переносит часть стоимости с чтения на запись и согласование. Она полезна не «для скорости вообще», а для конкретного измеренного профиля.
Пример: сумма заказа
В нормализованной модели сумму можно вычислить:
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; иначе сложность добавляется без доказанной пользы.