· 16 мин чтения

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

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

«У нас отчёты в BI грузятся по 15 минут, что делать?!» — этот вопрос я, Евгений Семёнов, директор ITFresh, слышу постоянно. Каждые три-четыре месяца кто-то приходит с такой проблемой. И знаете, волшебной таблетки здесь нет. Порой достаточно добавить пару индексов в PostgreSQL. В других случаях придётся разбивать таблицы на части — это называется партишенинг. А иногда, чего уж там, без колоночной базы данных просто никуда. Вот сегодня и поговорим: когда стоит присмотреться к ClickHouse, какие реальные плюсы он даёт и как это подтверждают цифры из нашей инфраструктуры.

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

PostgreSQL — это такой классический «строчно-ориентированный» зверь среди СУБД. Представьте: данные на диске хранятся по строкам. Вот все поля первой записи, тут же следом — все поля второй. Для OLTP-задач это просто идеально! Нужно найти покупателя №12345 и изменить его адрес? База быстро находит всю строку целиком, мгновенно считывает её, обновляет, и готово. Никаких лишних телодвижений.

А вот ClickHouse — это совсем другая история, он «колоночно-ориентированный». Что это значит? Каждая колонка хранится отдельно от остальных. Допустим, вам нужно посчитать общую сумму всех продаж (SUM(price)) за целый год. ClickHouse просто возьмёт и прочитает только одну эту колонку с ценами, начисто игнорируя остальные, может быть, 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 и четырьмя NVMe дисками на 7.68 ТБ каждый. Затем загрузили на них гигантскую таблицу веб-логов за два года — это 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 мсне применимо

Разница в скорости агрегаций? Сотни раз, и ClickHouse там просто король. А вот если нужно точечно что-то обновить, тут PostgreSQL вне конкуренции. Именно поэтому в реальной жизни их часто используют в связке — каждый делает то, что умеет лучше всего.

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

Для компаний среднего размера, на мой взгляд, идеальная схема выглядит так: PostgreSQL прекрасно подходит для всех транзакционных данных — это и заказы, и профили пользователей, и, конечно, платежи. А вот ClickHouse берёт на себя роль мощного аналитического склада, где хранятся все данные для ваших дашбордов и крутых ML-систем. Спрашиваете, как данные перемещаются между этими базами? Как правило, либо через CDC-механизмы, например, Debezium, который отправляет всё в Kafka, а оттуда уже в ClickHouse. Либо же мы используем батчевые загрузки, часто через специальную функцию `postgresql()` в самом ClickHouse.

-- В 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 рабочих дней:

Результаты, честно говоря, нас самих впечатлили! Дашборды, на которые раньше уходило по 40-50 минут ожидания, теперь готовы всего за 2-6 секунд. PostgreSQL прямо-таки вздохнул с облегчением: его CPU разгрузился на целых 70%, ведь мы перенесли с него все эти тяжёлые отчётные запросы. И это ещё не всё! Места на продакшн-серверах теперь требуется всего 3 ГБ в месяц вместо прежних 35 ГБ, потому что вся огромная историческая информация переехала в ClickHouse. Весь проект под ключ — включая лицензии на наше «железо» и три месяца нашей поддержки — обошёлся клиенту в 265 000 рублей.

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

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

Если вы хотите разобраться, как улучшить свою аналитику, я готов провести аудит, оценить потенциальный выигрыш от внедрения 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 подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.