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未解决 ClickHouse exception, code: 1002 DB::Exception: Directory already exists

clickhouse-物化视图

大数据ClickHouse进阶:Distributed引擎深入了解

大数据ClickHouse进阶(二十二):ClickHouse优化