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

Привет всем! С выходным всех У кого он есть А для остальных вопрос

есть

У нас есть целевая табличка событий ReplacingMT (~800млн строк)
Там есть колонка id(id юзера), и ts события

И другая AggregationMT, в которой хранится инфа о пользователях, и первый ts для каждого юзера

И запрос, который использует инфу о первом событии пользователя (ну типа появился ли пользователь в этом событии впервые, или уже существовал)

Проблема в том, что для join'a требуется очень много памяти, я выхожу за границы RAM

Есть ли какая-нибудь возможность присоединить к целевой таблице событий инфу о существовании пользователя, не напрягая столь сильно память? И как это сделать?

32 ответов

13 просмотров

если у вас FROM a JOIN b ON ... WHERE то замените на подзапросы FROM (SELECT .. FROM a WHERE ...) t1 JOIN (SELECT ... FROM b WHERE ...) t2 ON ... SELECT * надеюсь нет ? если не пролазите по подзапросам то dictGet из словаря LAYOUT(CACHE(...) https://clickhouse.com/docs/en/sql-reference/dictionaries#cache но скорость упадет скорее всего... причем сильно

Al-Kul Автор вопроса
Slach [altinity]
если у вас FROM a JOIN b ON ... WHERE то замените...

Спасибо огромное, сейчас покопаюсь, попробую, звучит как то, что должно помочь И да, конкретно в этой задаче легко могу пожертвовать скоростью в пользу стабильности

Зависит от запроса (сколько пользователей за раз запрашивается) но есть новый алгоритм grace_hash он значительно меньше памяти потребляет (в моих тестах на проде вместо 300гб - 40гб удается использовать) и медленее всего в 2-10 раз чем hash.

Al-Kul Автор вопроса
Denny [Altinity]
Зависит от запроса (сколько пользователей за раз з...

Сейчас почитаю, спасибо! Всегда по 2 пользователя (то есть в моем случае это 2* 400млн = 800 млн пользователей), но памяти расходуется много - просто при джоинах, как бы ни вертел, вылезаю из ограничений

Al-Kul Автор вопроса
Denny [Altinity]
Зависит от запроса (сколько пользователей за раз з...

Простите, не разобрался пока, это задается в контексте запроса строкой SETTINGS join_algorithm=grace_hash ?

Al-Kul Автор вопроса
Denny [Altinity]
Зависит от запроса (сколько пользователей за раз з...

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

Al Kul
Странно - пока не увидел разницы, слег из-за памят...

там можно задавать кол-во ведер я делаю join_algorithm = 'grace_hash', grace_hash_join_initial_buckets=8, grace_hash_join_max_buckets=8

Al-Kul Автор вопроса
Denny [Altinity]
там можно задавать кол-во ведер я делаю join_algo...

Не могу найти значение по умолчанию - неужели 1 бакет?

Denny [Altinity]
там можно задавать кол-во ведер я делаю join_algo...

select * from system.settings where name like 'grace_hash%'; ┌─name────────────────────────────┬─value─┬─changed─┬─description────────────────────────────────────┬─min──┬─max──┬─readonly─┬─type───┬─default─┬─alias_for─┐ │ grace_hash_join_initial_buckets │ 1 │ 0 │ Initial number of grace hash join buckets │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ UInt64 │ 1 │ │ │ grace_hash_join_max_buckets │ 1024 │ 0 │ Limit on the number of grace hash join buckets │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ UInt64 │ 1024 │ │ └─────────────────────────────────┴───────┴─────────┴────────────────────────────────────────────────┴──────┴──────┴──────────┴────────┴─────────┴───────────┘ там алгоритм который пытается менять / подобрать кол-во бакетов не очень хорошо работает

Al-Kul Автор вопроса
Denny [Altinity]
там можно задавать кол-во ведер я делаю join_algo...

Denny, подскажите, пожалуйста, с чем мб связана эта ошибка: Can't execute GRACE_HASH join algorithm for this strictness/kind and right storage type. (NOT_IMPLEMENTED) В джоне участвует табличка ReplacingMT, MT, да и все вроде

Al-Kul Автор вопроса
Denny [Altinity]
join - то какой ? ASOF ANY CROSS ?

Right join (outer же по умолчанию, так?)

Al Kul
Right join (outer же по умолчанию, так?)

так поменяйте местами таблицы и сделайте Left

Al-Kul Автор вопроса
Denny [Altinity]
так поменяйте местами таблицы и сделайте Left

Не понимаю, как и почему должно помочь, буду рад, если поясните Но попробую, спасибо! Однако, у меня и так сейчас слева таблица сильно больше, чем та что справа, разве не логичнее держать их в таком порядке?

Al Kul
Не понимаю, как и почему должно помочь, буду рад, ...

справа таблица не которая спара во from , а та которая справа и логике join

Al-Kul Автор вопроса
Slach [altinity]
если у вас FROM a JOIN b ON ... WHERE то замените...

Здравствуйте еще раз! Пытаюсь сейчас разобраться со словарем, подскажите еще пожалуйста Создал его как вы указали, но при попытке к нему обратиться я получаю ошибку авторизации: Authentication failed: password is incorrect, or there is no user with such name (хотя естесственно, в остальных запрос такого нет) То есть сохранить словарь надо как-то по-особенному, или в любом случае нужно передавать через запрос параметры user/pw? И если так, то как это сделать?

Al Kul
Здравствуйте еще раз! Пытаюсь сейчас разобраться ...

SHOW CREATE TABLE db.dictionary_name FORMAT Vertical; покажите без паролей

CREATE DICTIONARY item_dict ( id UInt64, attr String ) PRIMARY KEY id SOURCE(CLICKHOUSE(HOST 'localhost' PORT 9000 TABLE item_dict_t DB 'dw' USER 'myuser' PASSWORD 'mypassword' )) LIFETIME(MIN 0 MAX 0) LAYOUT(HASHED());

Al-Kul Автор вопроса

простите, что это за таблица? Просто копипаст дал, что нет такой таблицы

Al-Kul Автор вопроса
Denny [Altinity]
CREATE DICTIONARY item_dict ( id UInt64, attr Stri...

Спасибо большое - попробую! А при общении со словарями если удаленно всегда так? Это в настройках сервера надо колдовать?

Al Kul
Спасибо большое - попробую! А при общении со слов...

ну словарь всегда использует пользователь/пароль аунтефикацию непонятно в чем вопрос. можно ли опустить пользователь/пароль ? Можно, если они дефолтные можно ли описать пару пользователь/пароль по другому чтобы не писать их в CREATE DICTIONARY? можно - named collections

Al Kul
простите, что это за таблица? Просто копипаст дал,...

вы словарь сделали как ? через CREATE DICTIONARY или через XML?

ну, а имя словаря то помните и в какой базе создавали?? ну вот SHOW CREATE TABLE имя_базы.имя_словаря FORMAT Vertical покажите только пароль на XXX замените если он там в SOURCE есть

Al-Kul Автор вопроса
Slach [altinity]
ну, а имя словаря то помните и в какой базе создав...

Да, точно, извиняюсь Не указывал при создании В этом дело?

Al Kul
Да, точно, извиняюсь Не указывал при создании В эт...

сколько записей в adresses таблице? SELECT count() FROM default.addresses ? на сервер доступ по ssh есть? SELECT address, frist_transaction FROM remote('localhost:9000',default.addresses) FINAL работает? или тоже ошибку выдает? и шарь инфу ТЕКСТОМ, шаринг картинками текстовой инфы, это признаваться что ты не половозрелый подросток и в CTRL+C / CTRL+V не умеешь

Al-Kul Автор вопроса

Записей безумно много - 1млрд По ssh есть доступ, второй запрос отрабатывает Окей, буду текстом шарить, не вопрос)

Al Kul
Записей безумно много - 1млрд По ssh есть доступ,...

https://clickhouse.com/docs/en/operations/named-collections#ddl-example https://clickhouse.com/docs/en/operations/named-collections#example-of-using-named-collections-with-a-dictionary-with-source-clickhouse SOURCE(CLICKHOUSE(NAME ... QUERY '...'))

Al Kul
Записей безумно много - 1млрд По ssh есть доступ,...

вместо query сделай CREATE VIEW default.addresses_view AS SELECT address, first_transaction FROM default.addresses FINAL и вместо QUERY указывай обычную DB и TABLE

Al-Kul Автор вопроса
Slach [altinity]
вместо query сделай CREATE VIEW default.addresse...

Сделал Но пока получаю ошибку по прошествии 10 сек запроса SQL Error [1000] [08000]: Poco::Exception. Code: 1000, e.code() = 0, Not found: dictionary.layout.cache.size_in_cells Проверю создание

Al Kul
Сделал Но пока получаю ошибку по прошествии 10 се...

ну как бы доку надо почитать про LAYOUT(CACHE()) https://clickhouse.com/docs/en/sql-reference/dictionaries#cache

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

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

Ребят в СИ можно реализовать ООП?
Николай
33
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
Всем доброго вечера. Разрабатываю 32 раз. приложение в Delphi. Столкнулся с тем, что стандартный  TFilestream  не работает с большим файлом > 2 ГБайт (после вызова функции see...
Vadim Gl
16
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
добрый день. Подскажите, есть сайт на 1.4.7 и я хочу обновиться, особо ничего не меняя. мне выбирать версию 1.4.35 или третью ветку? и можно ли обновлять "как есть", или нужно...
Digital Cat
12
Кто кодит под Лазарем на винде, у вас аналогично VCL переопределяются CreateWnd и CreateParams для конкретных классов контролов и все заданные флаги влияют?
А Андрей
11
У меня задача: написать брокер сообщений. Очереди и потребители. Очереди поддерживают приоритеты. Очередь отдает сообщения, только обработчикам с соответствующими характеристи...
Aleksandr Filippov
2
народ, плиз хелп, всю голову сломал себе уже... разве может быть так, что GetProcAddress( GetModuleHandle( "kernel32.dll" ), "SetThreadDescription" ) вернёт ненулевое значение...
Iluha Companets
12
А, ты про текущую реализацию? Нет конечно, я бы сделал правильно - сейчас там гавнокод
Александр (Rouse_) Багель
6
Карта сайта