分区删除 (TRUNCATE PARTITION) ★首选推荐★
若历史数据是按时间分区(如日期、月份)存储的,这是最高效的方式。它直接删除整个分区的物理数据文件并更新元数据,避免逐行扫描和删除标记操作。
语法示例:TRUNCATE TABLE table_name PARTITION (p202301, p202302);
优势:秒级完成,资源消耗极低。
前提:必须预先根据时间周期建立分区。
使用删除标记 (Delete Sign) ★高吞吐场景推荐★
适用于 Unique Key 主键模型表,尤其适合需要频繁、大批量删除少量数据的场景(如 CDC 同步)。通过导入包含删除标记的数据行实现"逻辑删除"。
原理:在导入数据时指定特殊字段值(如 DORIS_DELETE_SIGN =true),系统自动合并时删除对应主键数据
优势:可与其他数据导入合并进行,效率远高于逐行执行 DELETE 语句。
适用场景:实时同步包含删除操作的 binlog 流
条件删除 (DELETE WHERE) ★精准删除时慎用★
传统 DELETE 语法允许按条件删除特定行数据。
sql
语法示例:DELETE FROM table_name PARTITION partition_name WHERE create_date < '2024-01-01';
局限性:
是同步操作,会启动独立的删除作业
删除大量数据时,需扫描相关数据并生成大量删除标记,后续Compaction合并时才真正物理删除,资源消耗大且存在延迟
建议:仅用于删除少量、分散的历史数据,避免高频或大批量使用
整表删除 (TRUNCATE TABLE) ★清空重置时使用★
当需要删除表中所有数据(全部历史数据)并保留表结构时使用。
语法:TRUNCATE TABLE table_name;
优势:比逐行删除或删除所有分区更快。
利用临时分区实现原子覆盖写 ★重写历史数据时推荐★
适用于需要完全替换某个历史分区数据的场景。先在临时分区导入新数据,再用原子操作替换原有分区:
ALTER TABLE table_name REPLACE PARTITION (p202301) WITH TEMPORARY PARTITION (tp_temp);
优势:替换操作瞬间完成,避免删除旧数据和导入新数据期间的数据不可见窗口期
对于未创建分区的 Doris 表,首选方案:改造表结构添加分区
sql
1.创建新分区表
CREATE TABLE new_table (
... -- 原表字段
) PARTITION BY RANGE(dt)( ... ) -- 按时间分区
DISTRIBUTED BY ...;
sql
2.迁移有效数据
使用 INSERT INTO new_table SELECT ... FROM old_table WHERE dt >= '保留起始时间' 迁移需保留的数据
3.后续可直接通过 TRUNCATE PARTITION 秒级删除过期分区