删除数据
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.05drop 函数
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可能会导致其他查询失败。
何时使用
truncate:- 如果在删除时可用磁盘空间有限,应使用
truncate。而DELETE会占用额外磁盘空间。 - 如果要完全删除整个表的所有数据,应使用
truncate,其性能优于DELETE。
删除一张大表中的部分数据:
dropPartition和DELETE组合使用,从而尽可能小地占用额外磁盘空间。- 或者将需要保留的数据取到内存,使用
dropPartition删除相应分区后,再将保留的数据写回。
