【发布时间】:2018-12-16 10:13:17
【问题描述】:
假设我有 2 个表 A 和 B。我用两个表的join 查询创建了一个MV(物化视图),伪像:
create materialized view a_b engine = Memory as
select * from(
select * from A
) all inner join (
select * from B
) using some_col;
我知道a_b 是only updated when inserting data 到表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。 2批次本身的一些数据(BD_A_B)适合join条件。 MV 是否有可能丢失那些 BD_A_B,因为 MV a_b 处理 BD_A 之前插入了 B 和 MV a_b_2 处理 BD_B 之前插入了 A。
【问题讨论】:
-
没有简单的方法来实现这一点。 ch中物化视图的实现依赖于一个且只有一个输入块流,它只能与一个表相关。在右连接表上更新视图也是低效的,因为它每次都需要重新创建一个哈希表,否则保持一个大的哈希表并消耗大量内存。
-
@nabongs 我也遇到了同样的问题。但对我来说,即使只更新了
A表,它也不起作用。我的观点总是空洞的。你有什么解决办法吗?代码和你的一模一样。 -
@Amos 那么问题是,如果我不能使用 join,为什么还要使用
Materialized View?这对我来说没有意义。 -
@Joozty 对我来说,如前所述,它在插入
A时有效,如果我想在更新B时自动更新,我必须创建另一个MV指向第一个 MV。 -
您的
A和B表使用什么引擎?我在 GitHub 上问了一个类似的问题,我得到了一个 answer 说这是不可能的。我想知道它对你有用,因为它不应该......
标签: clickhouse