删除数据

DolphinDB 提供了多种方式删除内存表和分布式表的数据。本页面主要介绍如何删除表中的数据行。

有关于其他删除方式,请参考对应页面:
注: 删除数据前请确认具有必要的权限。更多关于权限信息请参考:用户权限管理

删除分布式表中数据行

truncate 函数删除分布式表中的所有数据,并保留表结构。

该函数在性能方面较 DELETE 语句以及 dropPartition 函数均有数倍提升。

truncate(dbUrl="dfs://olapdemo", tableName="pt")

SQL DELETE 语句

可以使用 DELETE 语句从分布式表中删除数据。语法如下:
DELETE FROM <table> WHERE ...
例如删除分布式表 pt 中日期早于为 2023.10.05 的数据:
db = database("dfs://olapdemo",partitionType=VALUE, partitionScheme=2023.10.01..2023.10.10) 
pt = createPartitionedTable(dbHandle=db, table=t, tableName=`pt, partitionColumns=`date) 
pt.tableInsert(t) 

delete from pt where date < 2023.10.05

在删除分布式表数据时,系统会将数据加载到内存中,而后写回删除后的剩余数据。由于采用多版本并发控制机制,删除完成前仍允许访问删除前的顺序,且删除完成后新版本的数据文件与旧版本数据文件并存,直到旧版本数据文件被系统回收,因此使用 DELETE 请确保具有足够的磁盘空间。

因此,使用 DELETE 语句删除数据时建议在 WHERE 子句中包含分区字段,从而确保只有相关分区被加载到内存。否则,系统会将整个表的数据加载到内存处理,导致资源紧张。

truncate 函数

删除内存表的数据行

SQL DELETE 语句

可以使用 DELETE 语句从内存表中删除数据行。

例如删除分布式表 pt 中日期早于为 2023.10.05 的数据:
t = table(2023.10.01 + take(0..9,100) as date, take(["A01","B01","C01","D01"],100) as sym, 1..100 as val)
delete from t where date < 2023.10.05

drop 函数

drop 函数删除内存表中前 n 条或后 n 条数据行。

例如,删除内存表 t 的前 10 条数据
t = table(2023.10.01 + take(0..9,100) as date, take(["A01","B01","C01","D01"],100) as sym, 1..100 as val)
t = drop(t,10)
注: 由于 drop 函数不会修改原对象的值,用其删除数据时需使用赋值语句将其返回结果重新赋值给原对象。

erase! 函数

erase! 函数可以删除内存表中符合条件的数据行。

例如,删除内存表 t 中 data 为 2023.10.05 的数据行
t = table(2023.10.01 + take(0..9,100) as date, take(['A','B','C','D'],100) as sym, 1..100 as val)
erase!(obj=t,filter=<date<2023.10.05>)

clear! 函数

clear! 函数可以删除内存表中的所有数据,并保留表结构。

例如,删除内存表 t 中所有数据
t = table(2023.10.01 + take(0..9,100) as date, take(['A','B','C','D'],100) as sym, 1..100 as val)
clear!(t)

分布式表数据删除最佳实践

有三种方式删除分布式表中的数据,分别是 SQL DELETE 语句,truncate 函数 和 dropPartition 函数

何时使用 DELETE
  • 如果要求删除操作不影响正在进行的查询操作,应使用 DELETE。而 truncate 可能会导致其他查询失败。
  • 如果要求删除操作可以取消,应使用 DELETE。用户可通过 cancelJob 函数终止 DELETE 任务。而 truncate 一旦开始执行,除非遇到不可预见的错误导致删除失败,无法中止。
何时使用 truncate
  • 如果在删除时可用磁盘空间有限,应使用 truncate。而 DELETE 会占用额外磁盘空间。
  • 如果要完全删除整个表的所有数据,应使用 truncate,其性能优于 DELETE
删除一张大表中的部分数据:
  • dropPartitionDELETE 组合使用,从而尽可能小地占用额外磁盘空间。
  • 或者将需要保留的数据取到内存,使用 dropPartition 删除相应分区后,再将保留的数据写回。