Clickhouse - TTL - merge_with_ttl_timeout 不影响列 ttl
Posted
技术标签:
【中文标题】Clickhouse - TTL - merge_with_ttl_timeout 不影响列 ttl【英文标题】:Clickhouse - TTL - merge_with_ttl_timeout does not affect column ttl 【发布时间】:2021-01-18 10:18:09 【问题描述】:我试图对列 ttl 进行实验。为此,我创建了一个具有低 ttl 列的表并更改 ttl 频率,我将 merge_with_ttl_timeout 添加为 5 秒。但表永远不会(~ 1 小时)得到更新。即使我从下面的配置文件中更改了全局 ttl 超时也没有帮助。
<merge_tree>
<merge_with_ttl_timeout>10</merge_with_ttl_timeout>
</merge_tree>
检查:
select * from system.merge_tree_settings where name like '%ttl%';
表 ddl:
CREATE TABLE example_table
(
d DateTime,
a Int TTL d + INTERVAL 5 SECOND,
b Int TTL d + INTERVAL 10 SECOND,
c String
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(d)
ORDER BY d
SETTINGS merge_with_ttl_timeout=5;
强制 ttl 更新的手动命令(单独工作):
选项:ALTER TABLE example_table MODIFY COLUMN b String TTL d + INTERVAL 2 SECOND;
选项:ALTER TABLE example_table MATERIALIZE TTL;
另一方面,表 ttl 就像一个魅力(它会及时更新):
CREATE TABLE example_table2
(
d DateTime,
a Int,
b Int,
c String
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(d)
TTL d + INTERVAL 6 SECOND
ORDER BY d
SETTINGS merge_with_ttl_timeout=5;
总而言之,我想观察列 ttl 正在自动工作,我该如何实现?
Clickhouse 版本:20.12.5.14
【问题讨论】:
【参考方案1】:可能会执行
OPTIMIZE TABLE example_table2 FINAL;
在每个 SELECT 之前,正如这里建议的 TTL documentation。
【讨论】:
谢谢,但我希望它会自动完成。在我的情况下,即使手动调用此命令也无济于事。你有机会尝试吗? 如文档中所述“当 ClickHouse 合并数据部分时,将删除具有过期 TTL 的数据。当 ClickHouse 看到数据已过期时,它会执行计划外合并。要控制此类合并的频率,可以设置merge_with_ttl_timeout,如果值太小,会执行很多计划外的合并,可能会消耗大量资源。如果在合并之间执行SELECT查询,可能会得到过期数据。为避免这种情况,请使用OPTIMIZE在 SELECT 之前查询。” - 因此在合并发生时会执行删除过期数据。据我所知,您无法控制此事件。以上是关于Clickhouse - TTL - merge_with_ttl_timeout 不影响列 ttl的主要内容,如果未能解决你的问题,请参考以下文章
未设置 system.query_log 的 TTL (clickhouse)
clickhouse未解决 ClickHouse exception, code: 1002 DB::Exception: Directory already exists