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/
Материализованные представления и ReplacingMergeTree в ClickHouse