带有 TO 子句的 Clickhouse 物化视图不支持按

Posted

技术标签:

【中文标题】带有 TO 子句的 Clickhouse 物化视图不支持按【英文标题】:Clickhouse materialized view with TO clause doesn't support partition by 【发布时间】:2020-08-28 05:47:32 【问题描述】:

我使用 TO 语法将数据从物化视图移动到表中。因为,我需要定期从物化视图中清理旧分区,所以我尝试了以下语法但没有成功:

CREATE MATERIALIZED VIEW counter_daily_mv
 TO counter_daily
 ENGINE = MergeTree()
 PARTITION BY toYYYYMMDD(day) ORDER BY (device, count)
AS SELECT
    when as day,
    device,
    value as count
FROM counter

但是 PARTITION BY 可以在没有 TO 的情况下工作(见下文)。我该如何解决,以便我可以使用 TO 子句并仍然有效地清理物化视图?

CREATE MATERIALIZED VIEW counter_daily_mv
ENGINE = MergeTree()
 PARTITION BY toYYYYMMDD(day) ORDER BY (device, count)
AS SELECT
    when as day,
    device,
    value as count
FROM counter

【问题讨论】:

【参考方案1】:

这是预期的行为:对于在 TO 表达式中定义的现有表,不能重新定义已在其 CREATE 子句中定义的表的属性。

带有 TO

MV 确实 存储任何数据,它只是将其插入到 TO 中定义的表中。

它需要为 TO 中定义的表定义 TTL-clause 以自动删除额外数据:

CREATE TABLE test_source_data
(
    `id` Int32,
    `ts` DateTime
)
ENGINE = MergeTree()
PARTITION BY toYYYYMMDD(ts)
ORDER BY id

CREATE TABLE test_mv_storage
(
    `id` Int32,
    `ts` DateTime
)
ENGINE = MergeTree()
PARTITION BY toYYYYMMDD(ts)
ORDER BY id
TTL ts + INTERVAL 1 MONTH DELETE

CREATE MATERIALIZED VIEW test_mv TO test_mv_storage
AS
SELECT *
FROM test_source_data
WHERE id > 10

或使用 TTL 创建“可存储”MV(我更喜欢这种方式更紧凑):

CREATE TABLE test_source_data
(
    `id` Int32,
    `ts` DateTime
)
ENGINE = MergeTree()
PARTITION BY toYYYYMMDD(ts)
ORDER BY id

CREATE MATERIALIZED VIEW test_mv_2
ENGINE = MergeTree()
PARTITION BY toYYYYMMDD(ts)
ORDER BY id 
TTL ts + INTERVAL 1 MONTH DELETE
AS
SELECT *
FROM test_source_data
WHERE id > 10

在第二种情况下,CH 为 MV .inner.test_mv_2 创建了隐藏表(调用 show tables from db 来查看它)。


详情请见Putting Things Where They Belong Using New TTL Moves。

【讨论】:

以上是关于带有 TO 子句的 Clickhouse 物化视图不支持按的主要内容,如果未能解决你的问题,请参考以下文章

clickhouse创建物化视图数据来源是两张表该怎么写创建语句呢?

clickhouse:在启动时创建物化视图(docker)

为啥我们不能在 clickhouse 的另一个视图之上制作物化视图?

无缝更改ClickHouse物化视图SELECT逻辑的方法

ClickHouse-尚硅谷(13. 高级-物化视图)学习笔记

ClickHouse-尚硅谷(13. 高级-物化视图)学习笔记