ClickHouse vs PostgreSQL: что выбрать для вашей нагрузки
PostgreSQL и ClickHouse выбирают под разные профили нагрузки. PostgreSQL обычно удобнее для транзакций, точечных изменений и бизнес-ограничений. ClickHouse рассчитан на аналитическое чтение больших наборов данных и агрегации. Часто они работают вместе: PostgreSQL обслуживает приложение, ClickHouse — аналитические витрины.
ClickHouse vs PostgreSQL: таблица выбора
| Задача | PostgreSQL | ClickHouse |
|---|---|---|
| Заказы, платежи, изменения отдельных записей | Транзакции, ограничения, индексы | Проверяйте семантику операций и требования к согласованности |
| Суммы и группировки по истории событий | Возможны; важны план, индексы и объём чтения | Основной профиль колоночного аналитического движка |
| Частые JOIN | Планировщик и разные алгоритмы соединения | JOIN поддерживаются; важны алгоритм, память и модель данных |
| Материализованные представления | Сохранённый результат, обновляемый REFRESH | Есть инкрементальные и обновляемые по расписанию варианты |
| Масштабирование | Реплики, партиционирование; для распределения — отдельные решения | Шарды и реплики; необходимо проектирование ключей и топологии |
| Единственная база приложения | Подходит для широкого круга задач | Не переносите OLTP-модель без проверки операций |
Пример: заказ по ID и выручка за год
В транзакционном сценарии приложение меняет статус одного заказа и должно сохранить бизнес-ограничения. В аналитическом сценарии отчёт считает выручку по месяцам по большому числу заказов. Это разные тесты, даже если исходные данные одинаковы.
-- Точечное чтение: проверьте индекс по order_id
SELECT order_id, status, amount
FROM orders
WHERE order_id = 1001;
-- Аналитический запрос, синтаксис PostgreSQL
SELECT date_trunc('month', created_at) AS month,
sum(amount) AS revenue
FROM orders
WHERE created_at >= DATE '2025-01-01'
AND created_at < DATE '2026-01-01'
GROUP BY 1 ORDER BY 1;
-- Аналогичная группировка, синтаксис ClickHouse
SELECT toStartOfMonth(created_at) AS month,
sum(amount) AS revenue
FROM orders
WHERE created_at >= toDateTime('2025-01-01 00:00:00')
AND created_at < toDateTime('2026-01-01 00:00:00')
GROUP BY month ORDER BY month;
Это шаблоны для таблицы orders с указанными столбцами, а не результаты замера. Для корректного сравнения согласуйте тип суммы, часовой пояс и правила учёта отменённых заказов.
Материализованные представления: важная разница
В PostgreSQL обычное materialized view хранит результат запроса до следующего REFRESH MATERIALIZED VIEW. Инкрементальное materialized view в ClickHouse обрабатывает новые блоки вставки и записывает результат в целевую таблицу. Изменение старых строк источника не означает автоматического пересчёта всех прежних агрегатов. Refreshable materialized views — отдельный механизм с пересчётом по расписанию.
При подсчёте среднего недостаточно складывать средние разных партий. Нужны сумма и количество либо состояния агрегатной функции с корректным объединением.
Когда перенос аналитики оправдан
Миллионы строк сами по себе не являются пределом PostgreSQL. Сначала оцените план запроса, индексы, объём прочитанных данных и требования к задержке. PostgreSQL поддерживает параллельные планы: утверждение «процессоры не важны» неверно.
ClickHouse имеет смысл проверять, когда аналитическое чтение мешает приложению или стоимость агрегаций становится неприемлемой. При совместном использовании СУБД добавляются задачи доставки изменений, контроля дубликатов, обработки удалений и измерения задержки витрины.
Как сравнить на своей нагрузке
- Зафиксируйте версии, схему, объём, оборудование и настройки.
- Возьмите набор реальных запросов, включая тяжёлые и частые.
- Измерьте загрузку, обновления и запросы при одинаковой параллельности.
- Отдельно измерьте холодный и прогретый кэш, p50/p95 задержки и потребление ресурсов.
- Проверьте восстановление и требования к свежести данных.
Универсальный множитель ускорения здесь не приводится: результат относится только к измеренной нагрузке.
Для оценки архитектуры и плана пилота — консалтинг. Разобрать аналитическую модель и эксплуатацию можно в курсе по ClickHouse, а транзакции и запросы — в курсе по PostgreSQL.
Документация
- Параллельные запросы PostgreSQL
- Материализованные представления PostgreSQL
- Инкрементальные materialized views ClickHouse
- Refreshable materialized views



