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 массивы тоже есть, но менее идиоматичны для аналитики.

Что спрашивают на собеседованиях

Типичные вопросы

  1. Чем колоночная база отличается от строковой? — колоночная читает только нужные столбцы, строковая — всю строку. Для аналитических запросов с агрегациями по 2–3 столбцам из 50 колоночная в разы быстрее.

  2. Почему в ClickHouse нет UPDATE/DELETE? — есть, но через мутации (асинхронные, медленные). Колоночное хранение оптимизировано для append-only записи. Для изменения данных используют ReplacingMergeTree или CollapsingMergeTree.

  3. Когда использовать PostgreSQL, а когда ClickHouse? — PostgreSQL: транзакции, приложения, CRUD. ClickHouse: аналитика, дашборды, ad-hoc запросы по миллиардам строк.

  4. Что такое MergeTree? — основной движок таблиц в ClickHouse. Данные хранятся отсортированными по ключу, что ускоряет фильтрацию. Варианты: ReplacingMergeTree (дедупликация), AggregatingMergeTree (предагрегация).

  5. Напишите запрос, который работает иначе в 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(...))

Как подготовиться

  1. Учите PostgreSQL как основу — его синтаксис принимают на 99% собеседований
  2. Если идёте в крупную компанию (Яндекс, VK, Ozon) — изучите отличия ClickHouse
  3. Практикуйтесь: SQL-тренажёр, 50 задач
  4. Помните: на собеседовании оценивают логику, а не диалект. Если напишете PostgreSQL-синтаксис для ClickHouse-задачи — это нормально

Читайте также

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.