Pull to refresh

Comments 3

Агрегация данных, вставляемых разными пачками решается через комбинатор State или SimpleState
В вашем примере в матвью вместо count(*) можно сделать sumSimpleState(1), и селектить потом через sumMerge.

"Данные были вставлены в одном запросе и это имеет значение."
Это имеет значение, если выставлена настройка insert_deduplicate = 1. Для более эффективной вставки ее выставляют в 0, тогда и в одной вставке данные не будут схлопываться сразу.

И у вас в примерах во всех таблицах в ключе сортировки стоит поменять порядок: ORDER BY (app, time). Для полного счастья что-то вроде такого:
PARTITION BY toYYYYMM(date)
ORDER BY (date, app, time)

(при желании можно не делать отдельную колонку с датой, но так удобнее в запросах, а сожмется она в ноль)
После этого может оказаться, что и без матвью скорости хватает.

Спасибо обязательно попробую

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

как уже было сказано в предыдущем комментарии, типовую агрегацию данных следует делать на специальном движке AggregatingMergeTree в связке со -State-функциями в матпредставлении (эти функции хранят промежуточное агрегатное значение). для выборки использовать AggregateFunction() (см. документацию). такой подход избавит от проблем дубликатов и других "костылей" (вроде вспомогательных cron-скриптов с дополнительной логикой).
в сети достаточно гайдов для построения различных метрик на агрегатах (включая официальные от Clickhouse или Altinity). или, вот например, свежая статья здесь на хабре:
https://habr.com/ru/articles/736518/

Sign up to leave a comment.

Articles