代码之家  ›  专栏  ›  技术社区  ›  xmar

ClickHouse:如何从物化视图中删除*AggregatingMergeTree表

  •  0
  • xmar  · 技术社区  · 6 年前

    有一个结构,其中有一个 base 表,然后是一个物化视图 base_mv 这就是结果 TO AggregatedMergeTree 桌子 base_agg_by_id .然后我们可以看到最后一张桌子。 base_unique .与本文类似]( https://www.altinity.com/blog/clickhouse-continues-to-crush-time-series ).

    然而,如果我从 基础 ,我希望 基地号 会触发突变,然后对其采取行动,并在 按id分类的基本集合 ,但事实并非如此。

    这是预期的行为吗?如何 DELETE 在这样的模式中?

    我已经 seen here 在MVs中,你可以根据这些数据采取行动 .inner 桌子。然而,在这种情况下,由于该表来自AggregatedMergeTree,其字段被定义为函数(例如。 AggregateFunction(argMax, String, DateTime) ),我无法通过以下值应用删除操作: ALTER base_agg_by_id DELETE WHERE field = 'myval' .

    笔记作为记录,我们在复制环境中使用 Replicated* 引擎: base_d , base_agg_by_id_d , base_unique_d

    0 回复  |  直到 6 年前
        1
  •  3
  •   filimonov Corwin Joy    6 年前

    突变不会传播到物化视图。

    原因很简单:它 不可能 通常情况下。即使在理论上可能的情况下,这也可能是非常昂贵的操作。

    例如,假设您正在从表中删除一条记录,其中引用了一些 userid .而你的物化视图包含 uniqState( userid ) .用于计算 uniqState 不支持“删除”操作;但是,即使他们愿意,如果不重新读取分区的全部数据,也无法决定是否应该删除该用户ID,因为该用户ID也可以在其他记录中看到。

    所以在一般情况下,需要为AggregatedMergeTree重新填充整个分区。

    例如(每日分区情况):

        ALTER amt_table DROP PARTITION '2019-03-01';
    
        -- use same select as in your materialized view
        INSERT INTO amt_table SELECT ... WHERE date = '2019-03-01';