обновить материализованное представление с помощью оператора соединения

Предположим, у меня есть 2 таблицы A и B. Я создаю MV (материализованное представление) с join запросом из двух таблиц, псевдо-типа:

create materialized view a_b engine = Memory as 
select * from(
    select * from A
) all inner join (
    select * from B
) using some_col;

Я знаю, что a_b обновляется только при вставке данных в таблицу A и при отправке данных в B больше ничего не происходит. Я хочу, чтобы мой MV обновлялся при обновлении обеих таблиц.

Мой обходной путь - создать еще один MV, который изменяет размещение A, B и указывает на a_b как

create materialized view a_b_2 to a_b as 
select * from(
    select * from B
) all inner join (
    select * from A
) using same_col;

У меня есть несколько вопросов об этом подходе:
1. Есть ли more legal way для архивации того же эффекта в clickhouse?
2. Предположим, у меня есть 2 входящих пакета данных, которые BD_A и BD_B будут вставлены в A и B одновременно. Некоторые данные двух партий (BD_A_B) соответствуют join условию. Есть ли шанс, что MV потерял эти BD_A_B, потому что MV a_b обрабатывает BD_A с ранее вставленными B и MV a_b_2 процессами BD_B с ранее вставленными A.


person Thang Nguyen    schedule 08.07.2018    source источник
comment
Достичь этого непросто. Реализация материализованного представления в ch полагается на один и только один поток входных блоков, который может быть связан только с одной таблицей. Также неэффективно обновлять представление в правой соединительной таблице, так как необходимо каждый раз воссоздавать хеш-таблицу или же хранить большую хеш-таблицу и использовать много памяти.   -  person Amos    schedule 10.07.2018
comment
@nabongs У меня такая же проблема. Но у меня не работает даже только A таблица обновляется. Мой взгляд всегда пуст. У тебя есть какое-то решение? Код точно такой же, как у вас.   -  person Joozty    schedule 11.07.2018
comment
@Amos Итак, вопрос в том, зачем мне использовать Materialized View, если я не могу использовать соединение? Для меня это не имеет смысла.   -  person Joozty    schedule 11.07.2018
comment
@Joozty Для меня, как уже упоминалось, он работает при вставке в A, и если я хочу, чтобы оно автоматически обновлялось при обновлении B, я должен создать еще одну MV точку на первый MV.   -  person Thang Nguyen    schedule 11.07.2018
comment
Какие движки вы используете для своих A и B таблиц? Я задал аналогичный вопрос на GitHub и получил ответ, что это это невозможно. Мне интересно, это работает для вас, потому что не должно быть ...   -  person Joozty    schedule 11.07.2018
comment
@Joozty MV в основном используется для предварительной агрегации в Clickhouse.   -  person Amos    schedule 22.07.2018


Ответы (1)


Насколько я понимаю, вы пытаетесь обойти ограничение.

Clickhouse не поддерживает несколько исходных таблиц для MV, и для этого есть веские причины. Я действительно спросил об этом разработчиков и получил этот ответ:

В ClickHouse материализованное представление ведет себя больше как BEFORE INSERT TRIGGER, каждый раз при обработке нового блока, поступившего со вставкой.

Так что это вполне естественное ограничение, поскольку вставки в 2 разные таблицы будут выполняться асинхронно, и вы обычно ожидаете увидеть в JOIN целую таблицу, а не только вновь прибывшие блоки.

person Ramazan Polat    schedule 31.07.2019