Типичные ошибки и когда ClickHouse не подходит

Финальный урок: чек-лист грабель и трезвая граница применимости.

Большинство проблем с ClickHouse — не баги, а попытки использовать аналитическую базу как транзакционную.

Ошибка 1: мелкие частые вставки

Самая распространённая. Каждый INSERT — отдельный part; вставка по строке порождает лавину кусков и ошибку «too many parts». Лечение: батчи по тысячи/десятки тысяч строк, буферизация потока (приложение, Buffer-таблица, движок Kafka).

Ошибка 2: неверный ORDER BY

Если ключ сортировки не совпадает с тем, по чему вы фильтруете, отсечения гранул не происходит и запрос читает всю таблицу — «ClickHouse почему-то медленный». Лечение: проектируйте ORDER BY под реальные запросы (частый фильтр — первым в ключе). Высококардинальная «перемешивающая» колонка первой в ключе убивает отсечение.

Ошибка 3: частые мутации (UPDATE/DELETE)

В ClickHouse ALTER TABLE ... UPDATE/DELETE — это мутация: тяжёлая асинхронная операция, которая переписывает целые куски. Она не предназначена для частых точечных правок.

-- Это дорогая мутация, не как UPDATE в OLTP!
ALTER TABLE events UPDATE value = 0 WHERE user_id = 42;

Лечение: проектируйте так, чтобы правок не требовалось (append-only), или используйте ReplacingMergeTree/CollapsingMergeTree для логики «новой версии», а удаление старого делайте через DROP PARTITION/TTL.

Ошибка 4: SELECT * и лишние колонки

Колоночное преимущество исчезает, если читать все колонки. Лечение: выбирайте только нужные поля.

Ошибка 5: ждать мгновенной свёртки

Дедупликация/суммирование в спецдвижках и удаление по TTL происходят при слиянии, не сразу. Лечение: понимать асинхронность; при необходимости FINAL или агрегация в запросе.

Когда ClickHouse НЕ подходит

СценарийПочему мимо
OLTP-приложение (заказы, платежи)нет полноценных транзакций и дешёвых правок
Частые точечные UPDATE/DELETEмутации дорогие и асинхронные
Поиск/выдача по одной записипрофиль — массовое сканирование, не точечный доступ
Гарантия уникальности ключане обеспечивается ради скорости
Маленькие данные (мегабайты)выигрыша нет — хватит обычной СУБД
Сложные многотабличные транзакциине транзакционная база

Когда подходит идеально

  • Аналитика событий, логи, метрики, временные ряды.
  • Отчёты и дашборды по сотням миллионов и миллиардам строк.
  • Данные пишутся пачками и в основном не меняются (append-only).

Как работает под капотом

Все «ограничения» ClickHouse — следствие осознанного выбора в пользу скорости сканирования: колоночное хранение, отсутствие построчных транзакций, асинхронные слияния и мутации. Понимая этот компромисс, вы перестаёте бороться с инструментом и начинаете проектировать данные под него.

Частые ошибки (резюме)

  • Мелкие вставки → too many parts. Решение — батчи.
  • ORDER BY не под запросы → нет отсечения. Решение — ключ под фильтры.
  • Частые мутации → дорого. Решение — append-only и спецдвижки.

Итоги

  • Главные грабли: мелкие вставки, неверный ORDER BY, частые мутации.
  • ClickHouse не для OLTP, точечных правок и крошечных данных.
  • Он идеален для массовой аналитики append-only данных.
  • Проектируйте данные под колоночную модель — и инструмент раскроется.
Проверьте себя
1. Что такое мутация (ALTER TABLE ... UPDATE/DELETE) в ClickHouse?
AЛёгкая мгновенная правка как в OLTP
BТяжёлая асинхронная операция, переписывающая целые куски — не для частых точечных правок
CСпособ создать таблицу
DКоманда резервного копирования
2. Для какого сценария ClickHouse подходит хуже всего?
AАнализ миллиардов событий
BДашборды по логам
COLTP-приложение с транзакциями и частыми точечными UPDATE
DХранение метрик временных рядов
3. Как правильно удалять старые данные в ClickHouse?
AЧастым построчным DELETE
BЧерез DROP PARTITION или TTL
CНикак, данные нельзя удалять
DПерезапуском сервера