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

Подскажите плз. Есть две дистрибутед таблицы на 4 нодах x и

y, которые поверх шадированных таблиц x_sh и y_sh, x_sh по сути является матвью для y_sh, чуть урезаны столбы + другая сортировка. Надо найти условного пользователя, с набором товаров, похожим на набор товаров искомого пользователя. Выполняю запрос
select userid, count() cnt from db.x where productid in (select productid from db.y_sh where userid=123) group by userid having cnt>10 order by cnt desc limit 0, 10
если я все правильно понимаю, то происходит следующее:
1. на каждом шарде, из таблицы y_sh, выбирается, какие продукты купил пользователь 123
2. id продуктов сливаются на вызывающий хост
3. вызывающий хост раздает запросы шардам на выборку из таблицы x_sh тех корзин, где пользователи покупали продукты из списка, полученного в первой итерации
4. userid и факты наличия корзин льются на вызывающий хост
5. вызывающий хост завершает агрегации, суммируя результаты, сортируя и фильтруя по числу общих товаров.
Все хорошо, но много действий
У меня все шардировано по товарам, т.е. данные с разных шардов можно было бы просто суммировать. Как бы мне это сделать не поднимая 4 разных коннекта и не перенося логику на сторону приложения?
т.е. хочется выполнить на каждом шарде
select userid, count() cnt from db.x_sh where productid in (select productid from db.y_sh where userid=123) group by userid order by cnt desc limit 0,100
и следом на агрегирующем уже выполнить нечто типа
select userid, sum(cnt) from (..) group by userid having cnt>10 limit 0,10
таким образом итераций должно быть меньше + по сети не будут переливаться потенциально большие куски данных (например, несколько сотен тысяч условных товаров на итерациях 2 и 3 + тысячи пользователей на итерации 4)
Спасайте, что то я в тупике и не могу додумать)
При первом подходе, в моей инфраструктуре, для тежелого объекта данные считаются условно за 12 секунд, при выборке на одном шарде - 8 секунд (сверху прилетят еще аграгации, но там будут совсем крошки, 4 шарда по 100 записей).

1 ответов

14 просмотров

ээ нет. Работает именно как вы хотите. Можно выключить группировку финальную на инициаторе если вас шардировано по userid.

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
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
Карта сайта