Перейти к содержанию

PostgreSQL vs ClickHouse

Сравнения · Раздел 02

Тип материала: инженерное сравнение; выводы зависят от требований и условий эксплуатации. Схемы и примеры иллюстративны.

Область: PostgreSQL17; ClickHouse25.8. Численные latency/TPS/cost требуют измерений на сопоставимом workload с одинаковыми гарантиями.

Критерии выбора

Критерий PostgreSQL17 ClickHouse25.8
Workload Короткие transactions, point/range reads, constraints Column scans, GROUP BY, append-heavy analytics
Consistency ACID одной базы; isolation и locks; unique constraints MergeTree semantics; нет общей OLTP unique/multi-table гарантии
Latency Point latency зависит от index/cache/locks Batch scans и pruning; свежесть ingestion/query-time dedup отдельно
Throughput Write bottleneck: WAL, indexes, locks, hot row Ingest bottleneck: parts/merges, shard skew и memory aggregation
Cost Rows/indexes/WAL/replicas и active working set Compression экономит scan/storage; replicas/merges/FINAL стоят ресурсов
Scalability Scale-up/read replicas; sharding требует отдельного решения Shards+replicas встроенными engine paths; distributed queries имеют overhead
Operational complexity Vacuum, locks, PITR и replication slots Parts/merges, Keeper, dedup, MVs, backup и lag
flowchart LR
  Commands --> PG[PostgreSQL transaction]
  PG --> Outbox[Committed outbox]
  Outbox --> Kafka
  Kafka --> CH[ClickHouse read model]

Конкретные сценарии

Wallet debit с двумя проводками → PostgreSQL при подходящей local boundary. Daily betting turnover по миллионам immutable events → ClickHouse после корректного version/dedup контракта. Совместная схема → PG outbox/CDC → Kafka → CH, где финансовый факт и аналитическая видимость наблюдаются раздельно.

Ограничения и отказы

Не переносить сумму по raw CH rows в settlement без выбора последней версии; не направлять бесконечные scans на wallet primary. Потеря ответа commit и Kafka replay требуют idempotency на разных уровнях.

Как принять и проверить решение

Зафиксировать query mix, data distribution/skew, payload, working set, retention, concurrency, authoritative boundary и допустимую stale-read policy. Проверять steady state и maintenance, lost ACK, node loss, replay и restore. Сопоставлять total cost при одинаковых durability/replication requirements. Не объявлять универсального победителя по одному среднему времени запроса.

Типичные ошибки проектирования

Сравнивать default eventual/cache path с durable transactional commit; игнорировать operations/recovery; переносить benchmark другого dataset; выбирать продукт до определения access pattern.

Вопросы на собеседовании

Можно ли использовать варианты вместе? Да, если роли, data contracts и способы reconciliation определены. Дополнительная projection добавляет lag, replay и ownership, поэтому её польза должна покрывать эту сложность.

Практические упражнения

Для одного сценария выше составьте ADR: invariant, выбранный вариант, отклонённая альтернатива, failure outcomes и план измерений. Не задавайте придуманные TPS/SLA; перечислите входные данные, необходимые для sizing.

Дополнительные источники