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

Посоветуйте варианты работы с ретеншном? Каждому юзеру увидевшему баннер (AD), присваиваем

уникальный id (UID), в течении месяца он может совершить действие (ACTION).

Нюанс что действие (ACTION) совершается в другой системе, от которой мы получаем только id юзера (UID)

Задача найти за месяц баннеры которые были показаны юзерам которые совершили нужное действие.

SELECT ad, uid FROM db WHERE uid IN (SELECT DISTINCT uid FROM db WHERE action='ACTION') работает, но плохо.
В сутки до 50млн хитов, и до 500к хитов с нужными ACTION.

Наверняка у кого-то были схожие задачи. Что можно сделать чтоб избежать фул скан по UID ?

5 ответов

10 просмотров

Не уверен, но можно попробовать что-то типа SummingMergeTree + хранить action в массиве. Надо будет аккуратно настроить primary key + order by чтобы парты были адекватного размера. + Все сильно будет зависить от вставки (инсерт по многим uid породит очень много фоновых мержей). У меня такая система система для нескольких дней работала. Но в любом случае селект по строке uid - это не к клику. Я бы сделал этот на стороне а в клике оставил только статку CollapsingMergeTree и обновлял ее раз в N времени P.s. retention был бы проще потому что все action 1 uid хранятся в 1 строке

Ada-Min Автор вопроса
Иван
Не уверен, но можно попробовать что-то типа Summin...

SummingMergeTree не поможет, потому что по итогу нужны не только кол-во юзеров увидевших баннер, но и конкретные UID (и к примеру время показа банера/время дествия). Единственное, думал UID генерить на основе таймстемпа (вместо рандома).., что теоретически даст подсказку о том, в каком временном диапазоне искать инфу о показе банера. Но как это поможет оптимизировать запрос, и как для этого должна быть структурирована база пока не понимаю.

Ada Min
SummingMergeTree не поможет, потому что по итогу н...

Ну можно несколько колонок связанных иметь, но это не решает самой проблемы поиска по uid. https://clickhouse.tech/docs/ru/sql-reference/data-types/nested-data-structures/nested/ Плюс можно заполнять время ретеншена для uid из словаря в отдельную колонку, если uid-ов не так много. Но это все велосипеды

а сколько юзеров? select groupArray(ad), uid, countIf(action='ACTION') c group by uid having c>0

Иван
Не уверен, но можно попробовать что-то типа Summin...

>инсерт по многим uid породит очень много фоновых мержей нет

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

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

А чем вам питонисты не угодили?😂
.
79
Язык Си можно выучить за день? По книжке ANSI C на 230 страниц
Vincent Vegan
29
Привет, запускаю werf в dind в k8s, получаю ошибку на этапе build/beforeSetup: /.werf/stapel/embedded/bin/bash: /.werf/scripts/5898bdfe5214357d3706b879cc8d3d78460fb379607cbd...
florius0
7
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
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
Ребят, а за скок можно впарить анон чат с апишкой и веб админкой ?
Eugene Неелов
15
Кстати, я тут еще с одной темой столкнулся, вот учу я C++, на таком то ресурсе, а остальные постоянно советуют практиковаться, что то писать, проекты, но как писать если вот т...
aaswq1
7
Подскажите, можно ведь комбинировать запись данных в один и тот же Stream через TFileStream и через TCompressionStream поочерёдно? Ну т.е. часть данных мне нужно сжать, часть ...
notme
4
Ещё такой вопрос. Мне необходимо хранить пароль пользователя локально. Для этого планирую использовать ini файл. Это для автозаполнения полей логин и пароль при авторизации. Е...
Евгений
19
Кстати на работу никто не хочет, слегка на Сшке подписывать? От 170к в месяц, под Москвой
Andrey Ermakov
6
Карта сайта