Курс разбит на 5 спринтов по 5 модулей. Каждый спринт — 1-2 недели. К концу курса можешь оптимизировать ClickHouse-запросы и проектировать MergeTree-схемы.
Чем CH отличается от PostgreSQL/Snowflake:
Базовый pattern таблицы для аналитики событий:
CREATE TABLE events (
event_date Date,
event_time DateTime,
user_id UInt64,
event_type LowCardinality(String),
page_url String CODEC(ZSTD(3)),
duration_ms UInt32 CODEC(Delta, ZSTD(1)),
properties Map(String, String)
) ENGINE = MergeTree
PARTITION BY toYYYYMM(event_date)
ORDER BY (event_date, user_id, event_time)
SETTINGS index_granularity = 8192;
-- Запрос: топ-10 страниц по unique users за вчера
SELECT page_url, uniq(user_id) AS users
FROM events
WHERE event_date = yesterday()
GROUP BY page_url
ORDER BY users DESC
LIMIT 10;
-- Output: < 100мс на таблице с 10М строк
Самый распространённый CH-паттерн — pre-aggregation через MV. Создаём destination table + materialized view.
-- Destination table для агрегатов
CREATE TABLE events_daily (
event_date Date,
event_type LowCardinality(String),
total_events UInt64,
unique_users AggregateFunction(uniq, UInt64)
) ENGINE = AggregatingMergeTree
ORDER BY (event_date, event_type);
-- Materialized view как trigger
CREATE MATERIALIZED VIEW events_daily_mv TO events_daily AS
SELECT
event_date,
event_type,
count() AS total_events,
uniqState(user_id) AS unique_users
FROM events
GROUP BY event_date, event_type;
-- Query из агрегата (намного быстрее чем raw events)
SELECT event_date, uniqMerge(unique_users) AS dau
FROM events_daily
WHERE event_date >= today() - 7
GROUP BY event_date
ORDER BY event_date;
Чёткий decision-tree какую БД выбрать:
| Use case | Выбор | Почему |
|---|---|---|
| Транзакции банка | PostgreSQL | OLTP, ACID, нужны точечные UPDATE |
| Аналитика 100M+ событий | ClickHouse | OLAP, column-store, GROUP BY за секунды |
| Time-series с asof join | ClickHouse | ASOF JOIN — флагман CH |
| Real-time дашборд | ClickHouse | Materialized views, projections |
| Web-приложение с CRUD | PostgreSQL | CH плохо в UPDATE/DELETE |
| Hybrid OLTP/OLAP | PG + dbt | PG для OLTP, dbt для трансформаций в DW |
Зависит от компании. В Яндекс/Ozon/Wildberries — да, для Junior спросят базы CH. В банках/b2b SaaS — нет, там PostgreSQL. Если идёшь в маркетплейс — учи CH.
Snowflake — облачная OLAP БД с auto-scaling. CH — self-hosted (или managed через Yandex Cloud). CH дешевле, Snowflake удобнее в эксплуатации. На функционале похожи.
Технически да (sqlalchemy-clickhouse), но не рекомендуется. CH требует знания engine specifics (PREWHERE, materialized views). ORM скрывает это и даёт медленные запросы.
Тип данных для колонок с малым числом уникальных значений (страны, категории). Сжатие 5-10×, чтение быстрее. Аналог dict-encoding в Parquet.
MergeTree engine с поддержкой агрегатных функций через States (uniqState, sumState). Хранит partial aggregates, при чтении делает Merge. Используется в materialized views для pre-aggregation.
Официальная документация clickhouse.com/docs — лучший ресурс. Книг полноценных нет. Habr статьи от Avito/Cian/Yandex — практичные.