跳至主要内容

是否可以从 ClickHouse 表中删除旧记录?

·阅读时间:2 分钟

简短的答案是“是”。ClickHouse 有多种机制允许通过删除旧数据来释放磁盘空间。每种机制都针对不同的场景。

TTL

ClickHouse 允许在某些条件发生时自动删除值。此条件配置为基于任何列的表达式,通常只是任何时间戳列的静态偏移量。

这种方法的主要优势在于它不需要任何外部系统来触发,一旦配置了 TTL,数据删除就会在后台自动进行。

注意

TTL 还可以用于将数据不仅移动到 /dev/null,还可以移动到不同的存储系统之间,例如从 SSD 到 HDD。

有关 配置 TTL 的更多详细信息。

DELETE FROM

DELETE FROM 允许在 ClickHouse 中运行标准的 DELETE 查询。过滤器子句中目标行将被标记为已删除,并从将来的结果集中移除。行的清理异步进行。

注意

DELETE FROM 通常在 23.3 及更高版本中可用。在较旧的版本中,它是实验性的,必须使用以下命令启用

SET allow_experimental_lightweight_delete = true;

ALTER DELETE

ALTER DELETE 使用异步批处理操作删除行。与 DELETE FROM 不同,在 ALTER DELETE 之后和批处理操作完成之前运行的查询将包含目标删除的行。有关更多详细信息,请参阅 ALTER DELETE 文档。

ALTER DELETE 可以用于灵活地删除旧数据。如果您需要定期执行此操作,主要缺点是需要外部系统提交查询。由于即使只有一个行要删除,突变也会重写完整的部分,因此也需要考虑一些性能问题。

这是使基于 ClickHouse 的系统符合 GDPR 的最常见方法。

有关 突变 的更多详细信息。

DROP PARTITION

ALTER TABLE ... DROP PARTITION 提供了一种经济高效的方式来删除整个分区。它不够灵活,需要在表创建时配置正确的分区方案,但仍然涵盖了大多数常见情况。与突变一样,需要从外部系统执行定期使用。

有关 操作分区 的更多详细信息。

TRUNCATE

从表中删除所有数据相当激进,但在某些情况下,这可能正是您需要的。

有关 表截断 的更多详细信息。