跳至主要内容

删除数据

ClickHouse 中有多种删除数据的方法,每种方法都有其自身的优势和性能特征。您应根据您的数据模型和您打算删除的数据量选择合适的方法。

方法语法何时使用
轻量级删除DELETE FROM [table]删除少量数据时使用。行会立即从所有后续的 SELECT 查询中过滤掉,但最初仅在内部标记为已删除,而不是从磁盘中删除。
删除变异ALTER TABLE [table] DELETE当必须立即从磁盘中删除数据时使用(例如,为了合规性)。会对 SELECT 性能产生负面影响。
截断表TRUNCATE TABLE [db.table]有效地从表中删除所有数据。
删除分区DROP PARTITION有效地从分区中删除所有数据。

以下是 ClickHouse 中删除数据的不同方法的总结

轻量级删除

轻量级删除会导致行立即被标记为已删除,以便它们可以自动从所有后续的 SELECT 查询中过滤掉。随后删除这些已删除的行会在自然合并周期中发生,因此会减少 I/O。因此,在未指定的时间段内,数据实际上可能不会从存储中删除,而只是被标记为已删除。如果您需要保证数据被删除,请考虑上述变异命令。

-- delete all data from 2018 with a mutation. Not recommended.
DELETE FROM posts WHERE toYear(CreationDate) = 2018

使用轻量级 DELETE 语句删除大量数据也会对 SELECT 查询性能产生负面影响。该命令也不兼容具有投影的表。

请注意,在操作中使用变异来 标记已删除的行(添加 _row_exists 列),因此会产生一些 I/O。

通常,如果可以容忍磁盘上存在已删除的数据(例如,在非合规情况下),则应优先选择轻量级删除而不是变异。如果需要删除所有数据,则应避免这种方法。

阅读更多关于 轻量级删除 的内容。

删除变异

删除变异可以通过 ALTER TABLE … DELETE 命令发出,例如:

-- delete all data from 2018 with a mutation. Not recommended.
ALTER TABLE posts DELETE WHERE toYear(CreationDate) = 2018

这些可以同步执行(如果是非复制表,则默认为同步)或异步执行(由 mutations_sync 设置确定)。这些操作非常占用 I/O,会重写与 WHERE 表达式匹配的所有部分。此过程没有原子性 - 部分在准备好后立即被替换为变异的部分,并且在变异期间开始执行的 SELECT 查询将看到来自已变异部分的数据以及来自尚未变异部分的数据。用户可以通过 systems.mutations 表跟踪进度的状态。这些是 I/O 密集型操作,应谨慎使用,因为它们会影响集群 SELECT 性能。

阅读更多关于 删除变异 的内容。

截断表

如果需要删除表中的所有数据,请使用下面显示的 TRUNCATE TABLE 命令。这是一个轻量级操作。

TRUNCATE TABLE posts

阅读更多关于 TRUNCATE TABLE 的内容。

删除分区

如果您为数据指定了自定义分区键,则可以有效地删除分区。避免高基数分区。

ALTER TABLE posts (DROP PARTITION '2008')

阅读更多关于 DROP PARTITION 的内容。

更多资源