跳到主要内容

删除操作概述

Apache Doris 提供多种删除方式,覆盖按条件删除、按分区删除、整表清空、批量主键删除以及原子覆盖写等典型场景。本文从用户场景出发,帮助你快速选择最合适的删除方案。

快速导航

根据使用场景选择对应的删除方式:

使用场景推荐方式适用模型特点
按条件删除部分数据DELETE 语句所有表模型通用、灵活
删除过期分区(如保留近 7 天)分区删除(TRUNCATE)分区表仅修改元数据,效率最高
清空整张表,保留表结构整表删除(TRUNCATE)所有表模型快速重置数据
批量删除大量主键(CDC 同步等)删除标记(Delete Sign)Unique Key 主键模型通过更新方式实现批量删除
重写分区数据且查询不中断临时分区原子替换分区表原子覆盖,避免数据查询空窗

删除方式详解

1. DELETE 语句:按条件删除

适用于按条件删除部分数据的通用场景,支持所有表模型。

语法:

DELETE FROM table_name WHERE condition;

适用说明:

  • 可满足大多数日常删除需求
  • 在大批量删除或全分区删除场景下,效率不如下文其它方式

详细用法请参考 Delete 操作

2. 分区删除:高效清理过期数据

在 Doris 中,按日期分区管理数据是常见实践。当只需保留最近一段时间的数据(例如最近 7 天)时,推荐使用分区删除(truncate partition)。

语法:

TRUNCATE TABLE tbl PARTITION(p1, p2);

优势:

  • 仅修改分区元数据,无需扫描数据
  • 是过期分区清理场景下的最佳实践

详细用法请参考 Truncate 操作

3. 整表删除:快速清空表

适用于需要快速清空整张表但保留表结构的场景,例如离线分析中重做数据。

语法:

TRUNCATE TABLE table_name;

详细用法请参考 Truncate 操作

4. 删除标记(Delete Sign):批量主键删除

数据删除可视为数据更新的一种特殊形式。在具备更新能力的主键模型(Unique Key)上,可以通过删除标记,使用更新写入的方式实现删除。

典型场景:

  • CDC(Change Data Capture)数据同步:将一条 DELETE 操作的 binlog 打上删除标记后写入 Doris,即可删除对应主键的数据。

优势与限制:

  • 支持批量主键删除,效率高于 DELETE 语句
  • 属于高级功能,使用复杂度较高

详细用法请参考批量删除

5. 临时分区原子替换:覆盖写入不中断查询

当需要重写某一分区的数据时,若直接采用「先删除再导入」的方式,中间会出现一段无法查询的空窗期。临时分区原子替换可以避免该问题。

操作流程:

  1. 创建一个与目标分区对应的临时分区
  2. 将新数据导入临时分区
  3. 通过替换操作,原子地替换原有分区

详细用法请参考 临时分区。若需要对整张表进行原子替换,请参考 表原子替换

删除方式对比

方式语法关键字删除粒度性能是否支持所有表模型
DELETE 语句DELETE FROM按条件中等
分区删除TRUNCATE PARTITION整个分区高(元数据仅分区表
整表删除TRUNCATE TABLE整张表
删除标记写入 __DORIS_DELETE_SIGN__按主键高(批量)仅 Unique Key 模型
临时分区原子替换REPLACE PARTITION整个分区仅分区表

注意事项

  • 版本数量影响:删除操作会生成新的数据版本,频繁执行删除可能导致版本数量增加,进而影响查询性能。
  • 存储释放延迟:删除后的数据在 Compaction 完成前仍会占用存储,删除操作本身不会立即降低存储使用量。
  • 表模型限制:删除标记仅适用于 Unique Key 主键模型;分区相关删除仅适用于分区表。

常见问题(FAQ)

Q1:DELETE 语句和 TRUNCATE 有什么区别?

DELETE 语句按 WHERE 条件删除数据,可在任意表上使用;TRUNCATE 直接删除整张表或整个分区,只修改元数据,速度更快,但粒度更粗。

Q2:执行删除后存储空间为什么没有立即释放?

删除后的数据需要等待后台 Compaction 合并完成才会真正从存储中清除。这是正常现象。

Q3:CDC 同步场景如何高效处理 DELETE 事件?

推荐使用 Unique Key 主键模型 + 删除标记(Delete Sign)的方式,可以批量处理大量主键删除,效率明显高于逐条执行 DELETE 语句。

Q4:如何在重写分区数据时保证查询不中断?

使用临时分区原子替换:先将新数据写入临时分区,再通过原子替换操作切换分区,整个过程对查询透明。

相关文档