以下总结了在 ClickHouse 中删除数据的不同方式:
轻量级删除
SELECT 查询中都会被自动过滤掉。之后,这些已删除的行会在自然的 merge 周期中被移除,因此产生的 I/O 更少。因此,在一段未明确的时间内,数据实际上可能并未从存储中真正删除,而只是被标记为已删除。如果你需要确保数据已被删除,请考虑使用上述变更命令。
DELETE 语句删除大量数据,也可能对 SELECT 查询性能产生负面影响。该命令也不兼容带有投影的表。
请注意,此操作会使用变更来标记已删除的行 (添加一个 _row_exists 列) ,因此会产生一定的 I/O 开销。
一般来说,如果可以容忍已删除的数据仍保留在磁盘上 (例如在非合规场景中) ,应优先选择轻量级删除而不是变更。但如果需要删除所有数据,仍应避免使用这种方法。
阅读更多关于轻量级删除的内容。
删除变更
ALTER TABLE ... DELETE 命令执行删除变更,例如:
WHERE 表达式的 parts。这个过程不具备原子性——变更后的parts一旦准备就绪,就会立即替换原parts;因此,如果某个 SELECT 查询在变更过程中开始执行,就会同时看到已完成变更的parts中的数据和仍未变更的parts中的数据。用户可以通过 system.mutations 表跟踪其进度状态。这些都是 I/O 密集型操作,应谨慎使用,因为它们可能会影响集群的 SELECT 性能。
阅读更多关于删除变更的信息。
TRUNCATE 表
TRUNCATE TABLE 命令。这是一项轻量级操作。