【问题标题】:update materialized view with join statement使用 join 语句更新物化视图
【发布时间】:2018-12-16 10:13:17
【问题描述】:

假设我有 2 个表 AB。我用两个表的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_bonly updated when inserting data 到表A 中,当将数据推送到B 时不会发生其他任何事情。 我希望我的 MV 必须在两个表都更新时更新。

我的解决方法是创建另一个MV 来更改AB 的位置并指向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_ABD_B 将同时插入到 AB。 2批次本身的一些数据(BD_A_B)适合join条件。 MV 是否有可能丢失那些 BD_A_B,因为 MV a_b 处理 BD_A 之前插入了 BMV a_b_2 处理 BD_B 之前插入了 A

【问题讨论】:

  • 没有简单的方法来实现这一点。 ch中物化视图的实现依赖于一个且只有一个输入块流,它只能与一个表相关。在右连接表上更新视图也是低效的,因为它每次都需要重新创建一个哈希表,否则保持一个大的哈希表并消耗大量内存。
  • @nabongs 我也遇到了同样的问题。但对我来说,即使只更新了A 表,它也不起作用。我的观点总是空洞的。你有什么解决办法吗?代码和你的一模一样。
  • @Amos 那么问题是,如果我不能使用 join,为什么还要使用 Materialized View?这对我来说没有意义。
  • @Joozty 对我来说,如前所述,它在插入 A 时有效,如果我想在更新 B 时自动更新,我必须创建另一个 MV 指向第一个 MV。
  • 您的AB 表使用什么引擎?我在 GitHub 上问了一个类似的问题,我得到了一个 answer 说这是不可能的。我想知道它对你有用,因为它不应该......

标签: clickhouse


【解决方案1】:

据我了解,您正在尝试解决限制问题。

Clickhouse 不支持 MV 的多个源表,他们有充分的理由这样做。我实际上向开发人员询问了这个问题并得到了this answer

在 ClickHouse 中,物化视图的行为更像是 BEFORE INSERT TRIGGER,每次处理新块时都会插入。

所以这是很自然的限制,因为插入到 2 个不同的表将异步进行,您通常希望在 JOIN 中看到整个表,而不仅仅是新到达的块。

【讨论】:

    猜你喜欢
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    相关资源
    最近更新 更多