带有 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 的另一个视图之上制作物化视图?