创建两个源表,只有两个字段,通过id关联:
以前在使用oracle等数据库的物化视图,只要源数据表有更新,视图就能跟随更新。但使用了Clickhouse的物化视图后,有多表关联时,官方文档上就没有标明如何触发物化视图的更新了。本文就是要解决这个问题。
*
创建两个源表,只有两个字段,通过id关联:*
CREATE TABLE default.test0 (
`id` String,
`name` String
) ENGINE = MergeTree PARTITION BY id ORDER BY id SETTINGS index_granularity = 8192
CREATE TABLE default.test00 (
`id` String,
`name2` String
) ENGINE = MergeTree PARTITION BY id ORDER BY id SETTINGS index_granularity = 8192
insert into `default`.test0 values ('1','name1')
insert into `default`.test00 values ('1','name10')
select t0.id,name,name2 from `default`.test0 t0 join `default`.test00 t00 on t0.id=t00.id
当前用于建视图的as select语句是有结果的:
id | name | name2 |
---|---|---|
1 | name1 | name10 |
创建视图: |
create MATERIALIZED VIEW default.test_view ENGINE = MergeTree PARTITION BY id ORDER BY id SETTINGS index_granularity = 8192
AS select t0.id,name,name2 from `default`.test0 t0 join `default`.test00 t00 on t0.id=t00.id
select * from default.test_view
id | name | name2 |
---|
–插数据再查
insert into `default`.test0 values ('2','name2')
insert into `default`.test00 values ('2','name20')
select * from default.test_view
新增数据没有同步到物化视图:
id | name | name2 |
---|
只针对单表创建一个物化视图,不使用join:
create MATERIALIZED VIEW default.test_view0 ENGINE = MergeTree PARTITION BY id ORDER BY id SETTINGS index_granularity = 8192
AS select id,name FROM `default`.test0
select * from default.test_view
insert into `default`.test0 values ('5','name5')
select * from default.test_view0
结果物化视图数据同步了:
id | name |
---|---|
5 | name5 |
那么,基于单表建的物化视图与带关联的物化视图有何区别?这里是问题关键所在。
后来,在clickhouse上提问,得到了回复:
Materialiezed view 将在最左边的表插入后更新。
下面进行最左原则测试:
视图的查询语句是:
AS select t0.id,name,name2 from
`default`.test0 t0
join
`default`.test00 t00 on t0.id=t00.id
按从右表到左表插入数据:
insert into `default`.test00 values ('1','name10')
insert into `default`.test0 values ('1','name1')
查询一下物化视图:
select * from default.test_view
新插入数据进入视图了:
id | name | name2 |
---|---|---|
1 | name1 | name10 |
然后换顺序插一次:
insert into `default`.test0 values ('2','name2')
insert into `default`.test00 values ('2','name20')
再查询一下物化视图:
select * from default.test_view
新插到源表的数据没有进入视图:
id | name | name2 |
---|---|---|
1 | name1 | name10 |