184 похожих чатов

Ребята, всем привет. Тут столкнулись с проблемой потребления большого к-ва памяти

при join таблиц.
Есть 2 большие ReplacingMergeTree таблицы с партициями по месяцм. Эти таблицы джойнятся во вьюхе(left join).

Когда пытаешься селектить данные из вьюхи с date between, кликхаус выбирает все данные в память, джойнит, а потом уже фильтрует данные по дейт ренджу. Все согласно документации:
При запуске JOIN, отсутствует оптимизация порядка выполнения по отношению к другим стадиям запроса. Соединение (поиск в «правой» таблице) выполняется до фильтрации в WHERE и до агрегации. Чтобы явно задать порядок вычислений, рекомендуется выполнять JOIN подзапроса с подзапросом.

Но такой подход потребляет очень большое к-во оперативной памяти.

Вопрос: в будущем планируется ли оптимизация планировщика запросов, чтобы он добалял фильтрацию в таблицы, которые джойнятся?

24 ответов

23 просмотра
Антон-Швецов Автор вопроса

На сколько это важная и сложная задача для контрибьютеров clickhouse?

Если известны условия фильтрации, то можно (и лучше) сразу вместо join table2 делать join (select field1, field2 from table2 where ...).

Антон-Швецов Автор вопроса
Alexey Sokolov
Если известны условия фильтрации, то можно (и лучш...

Спасибо. Но у нас другой кейс, очень нужно сделать вьюху, в которой будут джойниться таблицы, а потом менять условия селекта

Антон Швецов
Спасибо. Но у нас другой кейс, очень нужно сделать...

Если допустимо отставание в актуальности данных, можно ещё вместо фильтрации сделать таблицу типа Set/Join, обновлять её по мере необходимости и работать с ней вместо джойна целой таблицы. Мне для обновления статистики раз в сутки такой вариант подошёл и сэкономил очень много времени.

Антон Швецов
у нас около 70тыс таблиц)

а откуда они взялись эти 70 тыщ таблиц? это из MySQL один в один перетекли данные? зачем так вообще?

Антон-Швецов Автор вопроса
Dmitry [Altinity] Titov
https://kb.altinity.com/altinity-kb-queries-and-sy...

Выглядит как хороший вариант, спасибо. Но как такой вариант будет работать, если мы подключим BI tool типа Tableau или Looker? Будет ли вообще работать, т.к. SQL выглядит кастомным

Антон-Швецов Автор вопроса
Slach [altinity]
а откуда они взялись эти 70 тыщ таблиц? это из MyS...

Храним репорты клиентов, много клиентов у каждого много репортов

Антон-Швецов Автор вопроса
Антон Швецов
Храним репорты клиентов, много клиентов у каждого ...

Сейчас задумываемся делать кастомные трансформации через DBT и визуализировать эти трансформации в BI Tool

Антон Швецов
Храним репорты клиентов, много клиентов у каждого ...

нельзя хранить в одной общей таблице с client id в PK? и сделать RBAC и row policy чтобы вытаскивать только то что можно...

Антон-Швецов Автор вопроса
Slach [altinity]
нельзя хранить в одной общей таблице с client id в...

У каждого отчета отдельная структура и гранулярность данных

Антон Швецов
У каждого отчета отдельная структура и гранулярнос...

Насколько эта структура отлична друг от друга?

Антон Швецов
Спасибо. Но у нас другой кейс, очень нужно сделать...

насколько я понимаю условия которые указываются в WHERE у вьюхи накладываются на результаты уже в самом конце, а не пробрасываются внутрь вьюхи. так что даже если сделают какую-то оптимизацию для джойнов, то при построении вьюхи сначала загрузятся все данные, а потом уже в самом конце отфильтруются за один день.

Антон-Швецов Автор вопроса
critskiy
Насколько эта структура отлична друг от друга?

сильно различаются, в одном репорте может быть 30 колонок, в другом 1000 Зависит от дата соурса и к-ва динамических метрик в нем настроенных

Антон Швецов
сильно различаются, в одном репорте может быть 30 ...

Я б на вашем месте вначале попробовал бы узнать наличие дублей (не помню, вы говорили какой движок у таблиц или нет), это раз. Динамические метрики, но суть их одна и та же? Вынести в таблицу и переделать схему хранения

Антон-Швецов Автор вопроса
Vladimir Goncharov
насколько я понимаю условия которые указываются в ...

Такая же проблема будет, если просто взять SQL вьюхи и дописать where в конце. Вьюха - это же просто сохраненный SQL. Я это к тому, что бд должна найти оптимальный план запроса, чтобы эффективно достать данные.

Антон-Швецов Автор вопроса
critskiy
Я б на вашем месте вначале попробовал бы узнать на...

У наз ReplacingMergeTree, дублей либо нет, либо их совсем немного. Что вы имеете ввиду Вынести в таблицу и переделать схему хранения?

Антон Швецов
У наз ReplacingMergeTree, дублей либо нет, либо их...

В прямом смысле, рассмотреть с точки зрения бизнес-логики верны ли ваши схемы, и можно ли информацию, там имеющуюся, переделать. ReplacingMergeTree? Ну хз, если задан неправильный ORDER BY key, да даже при правильно заданном, юзер может искать пробовать одну и ту же инфу

Антон-Швецов Автор вопроса
critskiy
В прямом смысле, рассмотреть с точки зрения бизнес...

С точки зрения бизнес логики и здравого смысла у нас правильная схема данных. Все данные в одну таблицу запихать непоулчится. И это не решает вопрос с неоптимальным планом queery при join таблиц

Антон Швецов
С точки зрения бизнес логики и здравого смысла у н...

Ммм, я б поспорил,да не буду. Я б задался вопросом: а правильно ли выбор пал на Кликхаус в вашем случае? Но менять что-либо поздно. :)

Антон-Швецов Автор вопроса
critskiy
Ммм, я б поспорил,да не буду. Я б задался вопросом...

Ну не прям поздно) просто очень дорого)

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта