删除数据
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
。
删除一张大表中的部分数据:
dropPartition
和DELETE
组合使用,从而尽可能小地占用额外磁盘空间。- 或者将需要保留的数据取到内存,使用
dropPartition
删除相应分区后,再将保留的数据写回。