как оно работает. Версия 20.11.4.13
Выполняю последовательно:
create table test1
(
id UUID,
dt DateTime,
v1 Int32,
v2 Int32
)
Engine = MergeTree()
partition by toYYYYMM(dt)
Order by (id)
create table test2
(
id UUID,
dt DateTime,
v1 Int32,
v2 Int32
)
Engine = MergeTree()
partition by toYYYYMM(dt)
Order by (id)
create materialized view test_mv Engine=MergeTree ORDER BY (same_as_v2)
as
SELECT
id as t1_id,
dt as t1_dt,
v1 as t1_v1,
v2 as t1_v2,
same_as_v2
from
(
select test1.*, test2.v2 as same_as_v2
from test1
inner join test2 USING id
where test1.v1 = 5
)
INSERT INTO test1
SELECT generateUUIDv4() as id,
now() + (sipHash64(id) % 10000000) as dt,
sipHash64(id) % 5000 as v1,
sipHash64(id) % 50000 as v2
from system.numbers n
limit 10000000
INSERT INTO test2
select * from test1
Выполнив это, получаю отсутствие строк в MV.
Если делаю все то же самое, но DDL MV такой, то данные есть:
create materialized view test_mv Engine=MergeTree ORDER BY (same_as_v2)
as
SELECT
test1.id as t1_id,
test1.dt as t1_dt,
test1.v1 as t1_v1,
test1.v2 as t1_v2,
same_as_v2
from
(
select test1.*, test2.v2 as same_as_v2
from test2
inner join test1 USING id
where test1.v1 = 5
)
Получается, что MV c JOIN — это триггер на INSERT только в левую таблицу? Если это все-таки так, то где это описано? Не увидел в доке описания такого поведения.
И еще, можно ли как-то сделать, чтобы MV было триггером на INSERT в обе таблицы? Или только если делать два MV и потом их объединять? И есть ли в таком случае гарантия, что данные сджойнятся если в обе таблицы произойдет синхронная вставка?
да все так. два MV и пусть пишут в одну таблицу. https://den-crane.github.io/Everything_you_should_know_about_materialized_views_commented.pdf 26 страница. https://youtu.be/1LVJ_WcLgF8?list=PLO3lfQbpDVI-hyw4MyqxEk3rDHw95SzxJ&t=7611
Обсуждают сегодня