删除操作概述
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. 临时分区原子替换:覆盖写入不中断查询
当需要重写某一分区的数据时,若直接采用「先删除再导入」的方式,中间会出现一段无法查询的空窗期。临时分区原子替换可以避免该问题。
操作流程:
- 创建一个与目标分区对应的临时分区
- 将新数据导入临时分区
- 通过替换操作,原子地替换原有分区
详细用法请参考 临时分区。若需要对整张表进行原子替换,请参考 表原子替换。
删除方式对比
| 方式 | 语法关键字 | 删除粒度 | 性能 | 是否支持所有表模型 |
|---|---|---|---|---|
| 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:如何在重写分区数据时保证查询不中断?
使用临时分区原子替换:先将新数据写入临时分区,再通过原子替换操作切换分区,整个过程对查询透明。