вам надо одновременно и count и сырые данные видеть? Обычно нужны агрегированные данные для статистики. А по сырым уже какие-то точечные запросы
да, не проблема просто суммировать count (по умолчанию 1), а сжатые данные > 1 будут, = SUM(count) — кол-во сообщений
ну так если вы можете агрегировать на лету, вам не надо делать запросы по сырым данным
а вариант сделать так: сначала записывать сырые данные, потом в полночь искать эти данные, удалять за один день через ALTER, после чего вставлять новую запись с данными за день, какие проблемы могут быть?
Объем - проблема)
объем чего?
Записей. Как всего, так и удаляемых. Альтерить то надо по строке..
звучит как реизобретение GraphiteMergeTree https://clickhouse.tech/docs/ru/engines/table-engines/mergetree-family/graphitemergetree/
в нём можно будет получать информацию по дням, от определённого человека?
зачем так хитро с графитом? Им вобще кто-то пользуется, кроме тех кто сделал? В КХ есть специально придуманная для вашей задачи AggregatingMergeThree. Почитайте про нее. Если вкратце, то вы как обычно делаете вставку в основную таблицу по 10-100к строк, затем через MV частично аггрегируете этот блок : create materialized view metrics ENGINE = AggregatingMergeTree order by (id,ts) as SELECT id , toStartOfDay(ts) ts, avgState(temp_val) temp_val, countState() qty FROM metrics GROUP BY id, ts; в результате в таблице в которую пишет MV будут лежать не конечные аггрегированные значения, а промежуточные, с типом AggregateFunction. Их можно легко слить друг с другом. Скажем для avg это два числа sum и count (потом можно поделить для получения среднего). Для слияния двух пар состояний мы складываем суммы и каунты. Для других аггрегационных функций состояния сложнее и могут занимать много места (скажем для groupArray - это все элементы массива). Для sum наоборот - все слишком просто и состояние равно результату функции, поэтому придуманы SimpleAggregateFunction, которые легче, но позволяют согласовать синтаксис типов данных в функциях выполняющих доаггрегацию (-Merge). В обычном процессе мерджинга партов все такие состояния сливаются, и вы получаете почти то, что хотели - аггрегированные за сутки данные. Причем результаты доступны в любой момент, и без скриптов что-то там стирающих в ночи.
ого, спасибо, запомню
А если идет удаление данных из исходной таблицы на MV это же не отражается? В таком случае надо чистить MV отдельно?
почистить будет непросто. лучше не удалять. "что написано пером - не вырубишь...." Для суммы есть старый бухгалтерский трюк под названием сторнирование - сделать отрицательную проводку. Просто вставляйте строку с минусовым значением, сумма и уменьшится.
Это понятно, что так идеологически правильно. Но на Alter Delete из исходной таблицы MV никак не реагирует?
Обсуждают сегодня