跳至主要内容
跳至主要内容

删除概述

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

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

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

轻量级删除

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

-- delete all data from 2018 with a lightweight delete. 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 查询将看到已经变异的部分的数据以及尚未变异的部分的数据。用户可以通过 system.mutations 表跟踪进度状态。这些操作对 I/O 强度很高,应谨慎使用,因为它们会影响集群 SELECT 性能。

了解更多关于 删除变异的信息。

截断表

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

TRUNCATE TABLE posts

了解更多关于 TRUNCATE TABLE的信息。

删除分区

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

ALTER TABLE posts (DROP PARTITION '2008')

了解更多关于 DROP PARTITION的信息。

更多资源

    © . This site is unofficial and not affiliated with ClickHouse, Inc.