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

时间:2019-03-21 16:21:18

标签: clickhouse

具有一个结构,其中有一个base表,然后是一个物化视图base_mv,该视图聚合了向TOAggregatedMergeTree发送结果base_agg_by_id的过程。然后,我们可以查看这张决赛桌。 base_unique。与此博客文章](https://www.altinity.com/blog/clickhouse-continues-to-crush-time-series)类似。

但是,如果我从base中删除,我希望base_mv会触发突变然后对其进行操作,并反映在base_agg_by_id上,但不会。

这是预期的行为吗?如何在这样的架构中DELETE

seen here表示,在保存数据的MV中,您可以对.inner表进行操作。但是,在这种情况下,由于该表来自AggregatedMergeTree,并且其字段定义为函数(例如AggregateFunction(argMax, String, DateTime)),因此我无法通过ALTER base_agg_by_id DELETE WHERE field = 'myval'之类的值来应用删除。

注意。作为记录,我们在使用Replicated*引擎的复制环境中拥有这些表:base_dbase_agg_by_id_dbase_unique_d

1 个答案:

答案 0 :(得分:1)

静音不会传播到实例化视图。

原因很简单:在常见情况下不可能。甚至在理论上可行的情况下,操作也可能非常昂贵。

例如,假设您要从表中删除引用某些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';