· 16 мин чтения

ClickHouse vs PostgreSQL для аналитики: где чья сила и как совмещать

Семёнов Евгений Сергеевич, директор АйТи Фреш. «У нас отчёты в BI грузятся по 15 минут, надо что-то делать» — типовой запрос, с которым ко мне приходят раз в три-четыре месяца. Ответ не универсален: иногда хватит индекса в PostgreSQL, иногда нужен партишенинг, а иногда — отдельная колоночная база. Разберу, когда пора ставить ClickHouse и что это даст, на примере реальных чисел из нашей инфраструктуры.

Главное различие: строки против колонок

PostgreSQL — классическая row-oriented СУБД. На диске строки таблицы лежат подряд: все поля первой записи, потом все поля второй. Это оптимально для OLTP: «найди покупателя №12345 и обнови его адрес» — один seek, считал всю строку, обновил.

ClickHouse — column-oriented. Каждая колонка хранится отдельно. Чтобы посчитать SUM(price) за год, ClickHouse читает только колонку price — игнорируя остальные 40 полей. На аналитике это даёт скачок производительности на порядки.

Таблица отличий

ПараметрPostgreSQLClickHouse
ОриентацияRow-based (строки)Column-based (колонки)
Тип нагрузкиOLTP: вставки, апдейты, точечные запросыOLAP: агрегации по большим объёмам
UPDATE/DELETEНативные, быстрыеТолько ALTER TABLE UPDATE, медленные
ТранзакцииПолный ACIDНет транзакций (атомарные вставки партиций)
СжатиеTOAST для больших значенийLZ4/ZSTD по колонкам, в 5-10 раз меньше
Вставка5-20k rows/sec на одну таблицу1-10 млн rows/sec
SQLПолный стандартSQL с расширениями, без FK, без полноценных JOIN для больших таблиц
ИндексыB-tree, GIN, GIST, BRINPrimary key (сортировка), sparse index

Бенчмарк на 2.4 млрд строк

Поставил у нас в дата-центре МТС Москва два одинаковых сервера Dell Xeon Platinum 8280, 256 ГБ RAM, 4 × NVMe 7.68 ТБ. Загрузили таблицу веб-логов за 2 года (2.4 млрд записей, 45 полей). Одинаковые запросы:

-- Агрегация количества запросов по URL за год
SELECT url, COUNT(*) as cnt
FROM weblogs
WHERE event_date >= '2024-01-01' AND event_date < '2025-01-01'
GROUP BY url
ORDER BY cnt DESC
LIMIT 100;
МетрикаPostgreSQL 16 + BRINClickHouse 24.3
Размер таблицы на диске186 ГБ22 ГБ
Время вставки 100 млн строк47 мин3 мин 12 сек
Запрос агрегации (холодный кэш)312 сек0.82 сек
Запрос агрегации (горячий кэш)58 сек0.31 сек
COUNT(DISTINCT user_id)184 сек2.4 сек
UPDATE одной строки по PK0.8 мсне применимо

Разница на агрегациях — сотни раз. На точечных апдейтах PostgreSQL выигрывает. Именно поэтому их часто используют вместе.

Гибридная архитектура: OLTP + OLAP

Правильный pattern для среднего бизнеса: PostgreSQL держит транзакционные данные (заказы, пользователи, платежи), ClickHouse — аналитическое хранилище для дашбордов и ML. Данные переливаются через CDC (Debezium → Kafka → ClickHouse) или батчами через postgresql() table function.

-- В ClickHouse
CREATE TABLE orders_analytics (
    order_id UInt64,
    user_id UInt64,
    amount Decimal(12, 2),
    status LowCardinality(String),
    created_at DateTime,
    region LowCardinality(String)
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(created_at)
ORDER BY (region, created_at, user_id)
SETTINGS index_granularity = 8192;

-- Первоначальная загрузка
INSERT INTO orders_analytics
SELECT * FROM postgresql('10.0.0.10:5432', 'shop', 'orders',
  'analytics_reader', 'password');

Когда ClickHouse точно нужен

Когда хватит PostgreSQL

Базовая установка ClickHouse

# Debian 12
apt install -y apt-transport-https ca-certificates dirmngr
GNUPGHOME=$(mktemp -d) \
gpg --no-default-keyring --keyring /usr/share/keyrings/clickhouse-keyring.gpg \
  --keyserver hkp://keyserver.ubuntu.com:80 \
  --recv-keys 8919F6BD2B48D754

echo "deb [signed-by=/usr/share/keyrings/clickhouse-keyring.gpg] \
  https://packages.clickhouse.com/deb stable main" \
  > /etc/apt/sources.list.d/clickhouse.list

apt update
apt install -y clickhouse-server clickhouse-client
systemctl enable --now clickhouse-server

Движки таблиц

ДвижокНазначение
MergeTreeБазовый, для обычных аналитических таблиц
ReplicatedMergeTreeДля кластеров с репликацией через ZooKeeper
ReplacingMergeTreeСхлопывает дубликаты по ключу
SummingMergeTreeСуммирует значения по ключу
AggregatingMergeTreeМатериализованные агрегаты
CollapsingMergeTreeДля обновлений через insert + sign

Реальный кейс: e-commerce на 80 млн заказов

В феврале 2025 пришёл клиент — маркетплейс товаров для дома. В PostgreSQL накопилось 80 млн заказов, 900 млн строк детализации, ежедневные дашборды для руководства собирались 40-50 минут. Команда уже думала про Snowflake, но хотела сначала оценить on-premise вариант.

Что сделали за 10 рабочих дней:

Результат: дашборды грузятся за 2-6 секунд вместо 40-50 минут, PostgreSQL разгрузился на 70% по CPU (нет больше тяжёлых reporting-запросов), место в продакшене стало увеличиваться на 3 ГБ/мес вместо 35 ГБ/мес (исторические данные переехали в ClickHouse). Стоимость проекта — 265 000 руб. с лицензией нашего железа и сопровождением 3 мес.

Советы из практики

Поможем с архитектурой и миграцией

Проведу аудит вашей аналитики, оценю выигрыш от ClickHouse на реальных данных, спроектирую ETL-конвейер. Размещаем ClickHouse на своих 8 серверах Dell Xeon Platinum 8280 с NVMe-хранилищем и 40G Mellanox в дата-центре МТС Москва. Пилот на реальных данных клиента — за 3-5 дней, от 60 000 руб.

Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш

FAQ — вопросы по ClickHouse и PostgreSQL

Можно ли заменить PostgreSQL на ClickHouse полностью?
Нет. ClickHouse — OLAP-база, не для транзакций. Используйте как дополнение к OLTP-хранилищу.
Какой порядок ускорения даёт ClickHouse на аналитике?
На агрегациях по миллиардам строк обычно в 50-500 раз быстрее PostgreSQL.
Сколько места занимает ClickHouse по сравнению с PostgreSQL?
В 5-10 раз меньше благодаря колоночному сжатию LZ4/ZSTD.
Как переливать данные из PostgreSQL в ClickHouse?
MaterializedPostgreSQL-движок, Debezium+Kafka или прямой INSERT через postgresql() table function.
Когда нужен кластер ClickHouse?
При объёмах больше 10 ТБ или скорости вставки >100 тыс. строк/сек, а также для отказоустойчивости через ReplicatedMergeTree.

Подпишитесь на рассылку ITfresh

Раз в неделю — практические гайды для руководителя IT и сисадмина: безопасность, 1С, миграции, резервные копии, лайфхаки из реальных проектов.

Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.