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 ответов

7 просмотров

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

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

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

Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
32
А чем вам питонисты не угодили?😂
.
79
Язык Си можно выучить за день? По книжке ANSI C на 230 страниц
Vincent Vegan
29
Привет, запускаю werf в dind в k8s, получаю ошибку на этапе build/beforeSetup: /.werf/stapel/embedded/bin/bash: /.werf/scripts/5898bdfe5214357d3706b879cc8d3d78460fb379607cbd...
florius0
7
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
Дорогие любители Прекрасной Джулии! Есть кто-то имеющий практический опыт построения ML для Систем Управления? Нам нужно сделать нейросеть для автоматической подстройки пара...
Roman Timo
4
С той же поддержкой Android в тулчейне, если кому интересно. На Swift Forums шло убогое обсуждение всякой херни годами, но ничего годного так и не появлялось. Пришел vgorloff ...
iMike
1
Dim Dim, [02.07.2024 11:07] DB 0x62 Dim Dim, [02.07.2024 11:07] DB 0x66 Dim Dim, [02.07.2024 11:07] кто пояснит что это?
Dim Dim
14
Приветствую ребята,у меня база есть,прорешал много задач с литкода,там деревья,списки, бэктрэкинг и все остальное,что мне сейчас делать?есть может куда устроиться поработать,е...
Aקuст Lеתסuд Aקuст Lеתסuд
5
Всех приветствую. Направьте меня в нужное русло. Постепенно переписываю проект с delphi на lazarus. Приложение - обычный windows/linux клиент для бд firebird. Тут все хорошо. ...
Mishutka
2
Карта сайта