clickhouse里物化视图如何跟随源表更新数据
创建两个源表,只有两个字段,通过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语句是有结果的:
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
–插数据再查
insert into `default`.test0 values (2,name2) insert into `default`.test00 values (2,name20) select * from default.test_view
新增数据没有同步到物化视图:
只针对单表创建一个物化视图,不使用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
结果物化视图数据同步了:
那么,基于单表建的物化视图与带关联的物化视图有何区别?这里是问题关键所在。
后来,在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
新插入数据进入视图了:
然后换顺序插一次:
insert into `default`.test0 values (2,name2) insert into `default`.test00 values (2,name20)
再查询一下物化视图:
select * from default.test_view
新插到源表的数据没有进入视图:
下一篇:
基于redis的点赞功能的实现