Раздел 38 · ClickHouse и аналитические базы

Типичные ошибки при работе с ClickHouse

junior~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Последний урок раздела соберёт всё пройденное в один чек-лист. Почти все проблемы с ClickHouse, о которых пишут в чатах и на форумах, это не баги базы, а одни и те же десять ошибок. Каждую мы уже разбирали по отдельности. Здесь они вместе, с симптомом и лечением, чтобы ты узнавал их с первого взгляда.

Ошибки загрузки

1. Вставка по одной строке. Симптом: растёт число частей, вставки замедляются, потом TOO_MANY_PARTS. Лечение: пачки от тысячи строк, лучше десятки тысяч, не чаще раза в секунду; для множества мелких клиентов асинхронная вставка. Урок 11.

2. Мелкие партиции. Симптом тот же: тысячи частей, которые не сливаются, ошибка о слишком многих партициях на вставку. Обычно это PARTITION BY по дню при малом потоке, по часу или, хуже того, по пользователю. Лечение: месяц по умолчанию, день только для десятков гигабайт в сутки. Урок 9.

3. Частые UPDATE и DELETE. Симптом: очередь мутаций в system.mutations растёт, диск занят переписыванием частей. Лечение: менять модель данных, а не строки. Последнее состояние хранить в ReplacingMergeTree, отмены в CollapsingMergeTree, старые данные удалять через TTL и DROP PARTITION. Урок 10.

Ошибки схемы

4. ORDER BY не под запросы. Симптом: запрос с фильтром читает всю таблицу. Частые варианты: ключ ORDER BY id, когда фильтруют по времени и зоне; время первым в ключе, когда почти всегда фильтруют по зоне; ORDER BY tuple(), то есть никакой сортировки. Лечение: ключ из колонок частых фильтров, от малого числа значений к большому, время в конце. Урок 8.

5. Nullable везде. Перенесли схему из PostgreSQL как есть, и каждая колонка стала Nullable. Симптом: лишняя маска на каждую колонку, запросы медленнее, а NULL нигде по смыслу не нужен. Лечение: Nullable только там, где пустота что-то значит.

6. String для всего. Даты строками, числа строками, статусы строками. Симптом: сравнение дат работает как сравнение текста, сжатие хуже, индекс по времени не помогает. Лечение: DateTime для времени, целые нужного размера, LowCardinality или Enum для статусов. Урок 6.

7. Ожидание уникальности от первичного ключа. Симптом: дубли в отчётах после повторной загрузки. Первичный ключ ClickHouse ничего не запрещает. Лечение: ReplacingMergeTree и FINAL или argMax в запросах, а лучше загрузка без повторов.

урок из курса

Урок из курса «ClickHouse и аналитические базы». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.