ClickHouse vs PostgreSQL: что нужно знать аналитику
Почему это важно
PostgreSQL — стандарт на собеседованиях и в стартапах. ClickHouse — стандарт в крупных продуктовых компаниях для аналитических запросов. Яндекс, VK, Ozon, Тинькофф, Авито — все используют ClickHouse для аналитики.
Если вы идёте на позицию аналитика в крупную компанию, вас могут спросить про отличия. А на работе вы будете переключаться между ними ежедневно.
Ключевые отличия
Архитектура
PostgreSQL — строковая (row-oriented) OLTP база. Хранит данные построчно. Оптимизирована для транзакций: INSERT, UPDATE, DELETE одной строки быстро.
ClickHouse — колоночная (column-oriented) OLAP база. Хранит данные по столбцам. Оптимизирована для аналитических запросов: SELECT SUM(amount) FROM orders WHERE date > '2026-01-01' — сканирует только столбцы amount и date, игнорируя остальные 50 столбцов.
Производительность
| Операция | PostgreSQL | ClickHouse |
|---|---|---|
| Агрегация 100M строк | минуты | секунды |
| INSERT одной строки | <1 мс | не рекомендуется |
| UPDATE/DELETE | поддерживается | ограничено (мутации) |
| JOIN больших таблиц | медленно | быстро (но join-ы менее идиоматичны) |
| Точечный SELECT по PK | <1 мс | медленнее |
Правило: PostgreSQL — для приложений, ClickHouse — для аналитики над большими данными.
Отличия в синтаксисе
Даты
-- PostgreSQL
SELECT DATE_TRUNC('month', created_at) AS month FROM orders;
SELECT created_at + INTERVAL '7 days' FROM orders;
-- ClickHouse
SELECT toStartOfMonth(created_at) AS month FROM orders;
SELECT created_at + INTERVAL 7 DAY FROM orders;
-- Или: addDays(created_at, 7)Типы данных
-- PostgreSQL
created_at TIMESTAMP WITH TIME ZONE
-- ClickHouse
created_at DateTime -- без тайм-зоны по умолчанию
-- или DateTime('Europe/Moscow')Агрегатные функции
-- PostgreSQL: FILTER
SELECT COUNT(*) FILTER (WHERE status = 'active') FROM users;
-- ClickHouse: countIf / sumIf
SELECT countIf(status = 'active') FROM users;
SELECT sumIf(amount, status = 'completed') FROM orders;Оконные функции
Оба поддерживают ROW_NUMBER, RANK, LAG, LEAD, SUM OVER. Синтаксис почти идентичен:
-- Работает одинаково в обоих
SELECT user_id, amount,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC) AS rn
FROM orders;Разница: ClickHouse не поддерживает ROWS BETWEEN в некоторых контекстах. Вместо этого используются arrayJoin и другие функции.
Приближённые функции (только ClickHouse)
-- Приближённый COUNT DISTINCT (быстрее на больших данных)
SELECT uniq(user_id) FROM events; -- HyperLogLog, ~2% погрешность
SELECT uniqExact(user_id) FROM events; -- точный, медленнее
-- Квантили
SELECT quantile(0.95)(response_time) FROM logs; -- P95
SELECT quantiles(0.5, 0.9, 0.99)(response_time) FROM logs;Массивы (сильная сторона ClickHouse)
-- ClickHouse: работа с массивами
SELECT user_id, groupArray(product_id) AS products
FROM orders GROUP BY user_id;
-- Развернуть массив
SELECT user_id, arrayJoin(products) AS product FROM user_products;В PostgreSQL массивы тоже есть, но менее идиоматичны для аналитики.
Что спрашивают на собеседованиях
Типичные вопросы
Чем колоночная база отличается от строковой? — колоночная читает только нужные столбцы, строковая — всю строку. Для аналитических запросов с агрегациями по 2–3 столбцам из 50 колоночная в разы быстрее.
Почему в ClickHouse нет UPDATE/DELETE? — есть, но через мутации (асинхронные, медленные). Колоночное хранение оптимизировано для append-only записи. Для изменения данных используют ReplacingMergeTree или CollapsingMergeTree.
Когда использовать PostgreSQL, а когда ClickHouse? — PostgreSQL: транзакции, приложения, CRUD. ClickHouse: аналитика, дашборды, ad-hoc запросы по миллиардам строк.
Что такое MergeTree? — основной движок таблиц в ClickHouse. Данные хранятся отсортированными по ключу, что ускоряет фильтрацию. Варианты: ReplacingMergeTree (дедупликация), AggregatingMergeTree (предагрегация).
Напишите запрос, который работает иначе в PostgreSQL и ClickHouse. — DATE_TRUNC vs toStartOfMonth, FILTER vs countIf, DISTINCT ON (только PostgreSQL).
Шпаргалка: PostgreSQL → ClickHouse
| PostgreSQL | ClickHouse |
|---|---|
DATE_TRUNC('month', dt) |
toStartOfMonth(dt) |
DATE_TRUNC('day', dt) |
toDate(dt) |
EXTRACT(YEAR FROM dt) |
toYear(dt) |
dt + INTERVAL '7 days' |
addDays(dt, 7) |
COUNT(*) FILTER (WHERE x) |
countIf(x) |
SUM(a) FILTER (WHERE x) |
sumIf(a, x) |
COUNT(DISTINCT col) |
uniq(col) или uniqExact(col) |
PERCENTILE_CONT(0.5) |
quantile(0.5)(col) |
STRING_AGG(col, ',') |
groupArray(col) + arrayStringConcat |
DISTINCT ON (col) |
argMax(val, order_col) |
GENERATE_SERIES(...) |
numbers() или arrayJoin(range(...)) |
Как подготовиться
- Учите PostgreSQL как основу — его синтаксис принимают на 99% собеседований
- Если идёте в крупную компанию (Яндекс, VK, Ozon) — изучите отличия ClickHouse
- Практикуйтесь: SQL-тренажёр, 50 задач
- Помните: на собеседовании оценивают логику, а не диалект. Если напишете PostgreSQL-синтаксис для ClickHouse-задачи — это нормально
Читайте также
- SQL на собеседовании аналитика
- Оконные функции SQL: шпаргалка
- 50 SQL-задач для собеседования
- 30 примеров SQL-запросов
- SQL-тренажёр: 200+ задач
FAQ
Нужно ли аналитику знать ClickHouse?
Для junior — нет, PostgreSQL достаточно. Для middle+ в крупных компаниях — да, как минимум отличия в синтаксисе (toStartOfMonth, countIf, uniq). Глубокое знание MergeTree и оптимизации — для senior.
Можно ли на собеседовании писать на PostgreSQL, если в компании ClickHouse?
Обычно да. Интервьюеры оценивают логику, а не диалект. Но если знаете ClickHouse-специфичные функции (countIf, quantile) — это плюс.
Какую СУБД учить первой?
PostgreSQL. Его синтаксис ближе к стандарту SQL, он проще для начала, и его принимают на всех собеседованиях. ClickHouse — после того, как уверенно пишете PostgreSQL.
Используют ли BigQuery или Redshift в российских компаниях?
Редко. Основные СУБД в российских продуктовых компаниях: PostgreSQL (OLTP), ClickHouse (OLAP). Иногда — Greenplum, Vertica, Spark SQL. BigQuery и Redshift встречаются в международных компаниях или у тех, кто использует облака AWS/GCP.
Потренируйтесь писать SQL для собеседований — откройте тренажёр с 200+ задачами на PostgreSQL.