删除数据
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 的内容。