什么是TTL?
TTL的意思是Time To Live表示數據的存活時間。由於數據的價值會根據保存的時間成反比,出於存儲成本的考慮通常只會保留近一年的數據。而在MergeTree (合並樹)引擎中,可以通過設置TTL來輕松管理數據的存活時間,使數據的價值最大化。當然數倉的數據是不會刪除的,不過會部分業務不需要舊數據,比如用戶的畫像數據,用戶畫像是按天按小時更新甚至實時更新,比較舊畫像數據繼續保存着沒價值則需要刪除。
在ClickHouse 中,TTL可以設置值的生命周期,它既可以為整張表設置,也可以為每個列字段單獨設置。表級別的 TTL 還會指定數據在磁盤和卷上自動轉移的邏輯。TTL 表達式的計算結果必須是 日期(date) 或 日期時間(datetime),如果同時設置了列級別的和表級別的TTL則以先到期的為准。
1.字段級別TTL
當列字段中的值過期時, ClickHouse會將它們替換成數據類型的默認值。如果分區內,某一列的所有值均已過期,ClickHouse會從文件系統中刪除此列。ClickHouse的INTERVAL(數據時間間隔)支持的操作有:second(秒),minute(分鍾),hour(小時),day(日),week(周),month(月),quarter(季度),year(年)。
示例:
-- 創建時指定 TTL CREATE TABLE example_table ( d DateTime, a Int TTL d + INTERVAL 1 day, b Int TTL d + INTERVAL 1 day, c String ) ENGINE = MergeTree PARTITION BY toYYYYMM(d) ORDER BY d; -- 為表中已存在的列字段添加 TTL ALTER TABLE example_table MODIFY COLUMN `c` String TTL d + toIntervalDay(1) -- 修改列字段的 TTL ALTER TABLE example_table MODIFY COLUMN c String TTL d + INTERVAL 1 WEEK;
2.表級別TTL
表可以設置一個用於移除過期行的表達式,以及多個用於在磁盤或卷上自動轉移數據片段的表達式。當表中的行過期時,ClickHouse 會刪除所有對應的行。
示例:event_date超過一個月的數據自動刪除
-- 創建時指定 TTL CREATE TABLE example_table ( `event_date` Date, `uid` Int32, `name` String ) ENGINE = AggregatingMergeTree() PARTITION BY event_date ORDER BY uid TTL event_date + toIntervalMonth(1) SETTINGS index_granularity = 128; -- 修改表的 TTL,event_date超過三個月的數據自動刪除 ALTER TABLE example_table MODIFY TTL event_date + toIntervalMonth(3);