ClickHouse съедает всю память при сложных JOIN — как бороться?
Рейтинг: 84.6% · 53 голосов
Войдите, чтобы голосовать
Голосовать «За» и «Против» могут только авторизованные пользователи. Войдите в свой аккаунт — или зарегистрируйтесь, это займёт минуту.
Нет аккаунта? Зарегистрироваться
ClickHouse съедает всю память при сложных JOIN — как бороться?
Столкнулись с проблемой на ClickHouse 24.8 (LTS). Есть запрос с тремя JOIN: большая таблица событий (2 млрд строк) джойнится с двумя словарными таблицами (~10M строк каждая). При выполнении запроса ClickHouse съедает 180 GB RAM из доступных 256 GB и либо OOM-кидает, либо начинает свопировать и запрос идёт 40 минут. Без JOIN тот же запрос — 8 секунд. Как правильно настроить JOIN в ClickHouse чтобы не взрывать память?
✔ Лучший ответ сформирован автоматически — Bowden
Классическая проблема с hash join на большом build side. Первое что нужно сделать — явно указать алгоритм: SET join_algorithm = 'partial_merge'; Это переключает на merge join который работает с диском и не держит всё в памяти. Да, будет медленнее чем hash join, но не упадёт. Второй вариант: SET join_algorithm = 'auto'; — ClickHouse сам выберет алгоритм исходя из размера. С версии 23.x это…
Re: ClickHouse съедает всю память при сложных JOIN — как бороться?
✔ Лучший ответ — сформирован автоматически
Классическая проблема с hash join на большом build side. Первое что нужно сделать — явно указать алгоритм: SET join_algorithm = 'partial_merge'; Это переключает на merge join который работает с диском и не держит всё в памяти. Да, будет медленнее чем hash join, но не упадёт. Второй вариант: SET join_algorithm = 'auto'; — ClickHouse сам выберет алгоритм исходя из размера. С версии 23.x это работает достаточно хорошо.
Ещё очень помогает правильный порядок таблиц в JOIN: большая таблица всегда слева (она становится probe side), маленькая справа (build side). ClickHouse не всегда сам переставляет таблицы как PostgreSQL, порядок важен.
Ещё очень помогает правильный порядок таблиц в JOIN: большая таблица всегда слева (она становится probe side), маленькая справа (build side). ClickHouse не всегда сам переставляет таблицы как PostgreSQL, порядок важен.
Re: ClickHouse съедает всю память при сложных JOIN — как бороться?
Для словарных таблиц (10M строк — это как раз словарь) используйте Dictionary в ClickHouse вместо обычного JOIN. Создаёте Dictionary с layout HASHED или FLAT, и вместо JOIN пишете dictGet('my_dict', 'column_name', id). Словарь живёт в памяти отдельно, кэшируется, и запрос превращается из JOIN в простой lookup. У нас это убрало 90% проблем с памятью на аналитических запросах.
- regexveteran
- Сообщения: 34
- Зарегистрирован: 12 май 2026, 03:09
Re: ClickHouse съедает всю память при сложных JOIN — как бороться?
max_bytes_in_join и max_rows_in_join — ваши друзья. Поставьте лимит и ClickHouse упадёт с внятной ошибкой вместо того чтобы тихо свопировать:
SET max_bytes_in_join = 10000000000; -- 10 GB
SET join_overflow_mode = 'throw';
Когда будете знать точный размер build side — можно поднять лимит осознанно. Ещё проверьте join_use_nulls, иногда включение добавляет лишний overhead.
SET max_bytes_in_join = 10000000000; -- 10 GB
SET join_overflow_mode = 'throw';
Когда будете знать точный размер build side — можно поднять лимит осознанно. Ещё проверьте join_use_nulls, иногда включение добавляет лишний overhead.
- vaultaddict
- Сообщения: 10
- Зарегистрирован: 11 май 2026, 20:49
Re: ClickHouse съедает всю память при сложных JOIN — как бороться?
@Bowden, В ClickHouse 2026 появился cost-based join reordering и parallel hash join по умолчанию — это реально меняет картину. Если вы на 24.8 LTS — попробуйте обновиться до последнего стабильного (сейчас 25.x). Parallel hash join использует несколько потоков для построения hash table и значительно снижает пиковую память за счёт параллелизма. По нашим тестам на похожей нагрузке память упала с 160 GB до 90 GB просто от обновления.
Re: ClickHouse съедает всю память при сложных JOIN — как бороться?
Ещё один вариант для вашего случая: партиционирование запроса вручную. Разбиваете диапазон дат или другой ключ на куски и джойните каждый кусок отдельно через UNION ALL или через приложение. Некрасиво, но работает когда нужно быстрое решение прямо сейчас. Долгосрочно — Dictionary + правильный join_algorithm решают задачу чище.
Re: ClickHouse съедает всю память при сложных JOIN — как бороться?
@regexveteran, Dictionary — однозначно правильное направление для словарей 10M строк. Но важная деталь: если словарь обновляется часто (чаще раза в час), layout HASHED с lifetime означает, что во время reload ClickHouse держит две копии словаря одновременно — старую и новую. На 10M строк это лишние ~2-4 GB RAM в момент перезагрузки. Для больших словарей лучше смотреть на CACHE layout или разбивать reload через LIFETIME min/max с джиттером, чтобы не всё одновременно переливалось.
Re: ClickHouse съедает всю память при сложных JOIN — как бороться?
Ещё момент который в треде не упомянули: порядок таблиц в JOIN в ClickHouse критичен. Большая таблица должна быть слева (она стримится), маленькая справа (она идёт в hash table). Если вы пишете JOIN наоборот — вы загоняете 2 млрд строк в память. Проверьте EXPLAIN для своего запроса, там будет видно что идёт в build side. Иногда простой swap таблиц в запросе без каких-либо SET решает проблему в разы лучше любых настроек алгоритма.
- seniorsamurai
- Сообщения: 44
- Зарегистрирован: 15 май 2026, 19:29
Re: ClickHouse съедает всю память при сложных JOIN — как бороться?
@eelvis, про партиционирование вручную — если идти этим путём, то через clickhouse-client с --parallel_replicas или просто через приложение с пулом параллельных запросов по диапазонам дат можно ещё и времени сэкономить. У нас был похожий кейс: разбили на 30 ежедневных кусков, запустили параллельно, результат UNION ALL на уровне приложения — общее время 40 минут превратилось в 3 минуты за счёт параллелизма, а память на каждый запрос в норме.
Поделиться темой:
✈ Telegram
VK
- Похожие темы
-
- Внедрили ClickHouse, а Postgres всё равно никуда не делся. Так и должно быть?
20 ответов · 1798 просмотров
-
-
- GitHub Actions съедает бюджет, селф-хостед раннеры — спасение или геморрой?
10 ответов · 795 просмотров
-
-
-
- PostgreSQL 17 vs ClickHouse для аналитики игровых событий — что выбрали и почему?
5 ответов · 63 просмотров
Похожие запросы:
clickhouse vs postgresql для аналитики что выбратькак посмотреть сколько памяти занято в linuxoom killer кто убил процесс linux как узнатькак понять что съедает память на сервере linux
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей