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

Коллеги, а вопрос по projections. Допустим у меня в projection

там есть max(ts) /* timestamp */. И я инсерчу в основную таблицу новые строки, которые соответственно содержат новый ts. И потом делаю select max(ts), а там projection должен включиться. Так вот. Где и какие гарантии есть на то, что проекция уже успеет обновиться? Я так понимаю, что нету гарантий, нужно явно что-то делать? Но что? Optimize?

16 ответов

10 просмотров

так оно сразу синхронно должно записать, ваш инсерт порождает новый парт. А проекция это по сути ещё один парт внутри того что создался. Проекции не пересчитывают данные за старые периоды, это просто агрегация данных из одного парта. Вы вставили 100 раз, у вас создалось 100 партов. В каждом из этих 100 партов будет внутри ещё по 1 парту на проекцию, в котором хранится state, примерно так же как и в AggregatingMergeTree. Ну и дальше все подсчёты и мержи работают как с обычной таблицей

Zorro-Zorroff Автор вопроса
Konstantin Ilchenko
так оно сразу синхронно должно записать, ваш инсер...

Если это агрегирующий запрос, аггрегирующая проекция, то я пока что плохо понимаю как это возможно. Какой отдельный part для max(ts)? Это означало бы что финальный запрос из них делает финальный max(ts). Что в принципе могло бы работать для ряда простых агрегирующих функций, но вот avg() уже требует sum/count для такой реализации, а если взять произвольные arrayElement(groupArray(val), N), то там вообще не решаемо простым образом, наверняка это накладывает ограничения, или мое понимание не верно.

Zorro Zorroff
Если это агрегирующий запрос, аггрегирующая проекц...

Хаха. Ну вот бежит avg на 100 серверах в 1000 потоков, каждый считает свой avg. И как это возможно потом ссоединить?

Zorro Zorroff
Если это агрегирующий запрос, аггрегирующая проекц...

считайте что проекция, это MatView в AggregatingMergeTree у которой patition by унаследован от основной таблицы. И проекция достаточно умная чтобы подменить имя основной таблицы на Aggregating таблицу > Какой отдельный part для max(ts)? в 100 партах будет храниться maxState, который потом прочитается из 100 партов и объединится через maxMerge > но вот avg() уже требует sum/count для такой реализации Есть avgState который можно хранить. Состояние любой агрегатной функции можно хранить. groupArrayState тоже можно и uniqState. Это то как параллелится вычисление между серверами и потом объеденяется на init ноде

Zorro-Zorroff Автор вопроса
Denny [Altinity]
Хаха. Ну вот бежит avg на 100 серверах в 1000 пото...

Я и не говорю что это где-то соединяется в одном месте. Я сейчас пытаюсь понять как это устроено.

Zorro-Zorroff Автор вопроса
Konstantin Ilchenko
считайте что проекция, это MatView в AggregatingMe...

Вы дали мне ответ, да, спасибо. То что надо. То есть состояние агрегатных функций хранится всё необходимое. Я еще не до конца уверен, что это работает для ЛЮБОЙ функции, но это правильная, годная реализация.

Zorro Zorroff
Вы дали мне ответ, да, спасибо. То что надо. То ес...

Ну вот так. Зависит от функцвии. AvgState два числа хранит sum,count . А например medianExactState и uniqExactState просто хранят все исходные значения только в виде массива а не колонки. И state там огромного размера.

Zorro-Zorroff Автор вопроса
Denny [Altinity]
Ну вот так. Зависит от функцвии. AvgState два числ...

Да, если довести до предела, там может храниться и всё целиком. Спасибо за подтверждение.

Zorro-Zorroff Автор вопроса
Konstantin Ilchenko
считайте что проекция, это MatView в AggregatingMe...

Я понимаю что materialized view и проекции используют один механизм, и сейчас мне стало ясно, какая именно реализация у вас.

Zorro Zorroff
Да, если довести до предела, там может храниться и...

https://engineering.oden.io/blog/how-to-write-a-clickhouse-aggregate-function

Zorro-Zorroff Автор вопроса
Denny [Altinity]
https://engineering.oden.io/blog/how-to-write-a-cl...

Это я вдохновил на написание что ли?

Zorro Zorroff
Это я вдохновил на написание что ли?

это не я написал. Это случайность. Они эту статью опубликовали сегодня.

Zorro Zorroff
Это я вдохновил на написание что ли?

Вам писать пожелания по новым статьям?

Zorro-Zorroff Автор вопроса
Denny [Altinity]
троллят

Няшно тут. Dmitry, конечно пишите.

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта