там есть max(ts) /* timestamp */. И я инсерчу в основную таблицу новые строки, которые соответственно содержат новый ts. И потом делаю select max(ts), а там projection должен включиться. Так вот. Где и какие гарантии есть на то, что проекция уже успеет обновиться? Я так понимаю, что нету гарантий, нужно явно что-то делать? Но что? Optimize?
так оно сразу синхронно должно записать, ваш инсерт порождает новый парт. А проекция это по сути ещё один парт внутри того что создался. Проекции не пересчитывают данные за старые периоды, это просто агрегация данных из одного парта. Вы вставили 100 раз, у вас создалось 100 партов. В каждом из этих 100 партов будет внутри ещё по 1 парту на проекцию, в котором хранится state, примерно так же как и в AggregatingMergeTree. Ну и дальше все подсчёты и мержи работают как с обычной таблицей
Если это агрегирующий запрос, аггрегирующая проекция, то я пока что плохо понимаю как это возможно. Какой отдельный part для max(ts)? Это означало бы что финальный запрос из них делает финальный max(ts). Что в принципе могло бы работать для ряда простых агрегирующих функций, но вот avg() уже требует sum/count для такой реализации, а если взять произвольные arrayElement(groupArray(val), N), то там вообще не решаемо простым образом, наверняка это накладывает ограничения, или мое понимание не верно.
Хаха. Ну вот бежит avg на 100 серверах в 1000 потоков, каждый считает свой avg. И как это возможно потом ссоединить?
считайте что проекция, это MatView в AggregatingMergeTree у которой patition by унаследован от основной таблицы. И проекция достаточно умная чтобы подменить имя основной таблицы на Aggregating таблицу > Какой отдельный part для max(ts)? в 100 партах будет храниться maxState, который потом прочитается из 100 партов и объединится через maxMerge > но вот avg() уже требует sum/count для такой реализации Есть avgState который можно хранить. Состояние любой агрегатной функции можно хранить. groupArrayState тоже можно и uniqState. Это то как параллелится вычисление между серверами и потом объеденяется на init ноде
Я и не говорю что это где-то соединяется в одном месте. Я сейчас пытаюсь понять как это устроено.
Вы дали мне ответ, да, спасибо. То что надо. То есть состояние агрегатных функций хранится всё необходимое. Я еще не до конца уверен, что это работает для ЛЮБОЙ функции, но это правильная, годная реализация.
Ну вот так. Зависит от функцвии. AvgState два числа хранит sum,count . А например medianExactState и uniqExactState просто хранят все исходные значения только в виде массива а не колонки. И state там огромного размера.
Да, если довести до предела, там может храниться и всё целиком. Спасибо за подтверждение.
Я понимаю что materialized view и проекции используют один механизм, и сейчас мне стало ясно, какая именно реализация у вас.
https://engineering.oden.io/blog/how-to-write-a-clickhouse-aggregate-function
Это я вдохновил на написание что ли?
это не я написал. Это случайность. Они эту статью опубликовали сегодня.
Вам писать пожелания по новым статьям?
троллят
Няшно тут. Dmitry, конечно пишите.
Обсуждают сегодня