删除数据
删除数据需要执行用户具有相应权限,否则无法删除。关于删除权限,参考:用户权限管理。
DolphinDB 提供了多种方法删除数据,既可通过 SQL 语句或函数方法直接删除数据,也可通过设置数据保留方案定期删除过期数据。本文重点介绍 SQL 语句和函数方法,自动删除过期数据请参考分级存储。
通过 SQL 语句删除数据
可以使用 DELETE 语句从表中删除数据:
DELETE FROM <table> WHERE ...
下例删除内存表 t 中日期早于为 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
下例删除分布式表 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
语句删除数据,会首先根据WHERE
子句过滤数据,将相关分区的数据加载到内存,然后删除特定数据,再将其余数据写回数据库。多版本并发控制机制会将此版本数据存储在磁盘上的另一个文件。这样可以确保在删除操作完成前,用户仍可以查询完整的删除前的数据。因此此时磁盘占用可能会高于删除前。当一段时间后旧版本回收删除时,磁盘空间就可以释放。因此使用DELETE
语句删除分布式表的数据,需要有足够的内存和磁盘空间。 -
WHERE
子句的过滤条件应包含分区字段,如果没有,则会将所有分区的数据加载到内存处理,容易造成内存资源紧张。
函数删除分布式表中的所有数据,并保留表结构。
该函数在性能方面较 DELETE
语句以及 dropPartition 函数均有数倍提升。
truncate(dbUrl="dfs://olapdemo", tableName="pt")
通过函数删除数据
truncate 函数
truncate 可以删除分布式表中的所有数据,并保留表结构。
DELETE
语句以及 dropPartition
均有数倍提升。truncate(dbUrl="dfs://olapdemo", tableName="pt")
clear! 函数
t = table(2023.10.01 + take(0..9,100) as date, take(["A01","B01","C01","D01"],100) as sym, 1..100 as val)
clear!(t)
erase! 函数
t = table(2023.10.01 + take(0..9,100) as date, take(["A01","B01","C01","D01"],100) as sym, 1..100 as val)
erase!(obj=t,filter=<date<2023.10.05>)
drop 函数
drop
函数不会修改原对象的值,用其删除数据时需使用赋值语句将其返回结果重新赋值给原对象。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)
不同删除方法的区别
-
当有一个查询正在进行时,使用
DELETE
语句删除该表数据不会影响此查询,truncate
会导致查询失败。 -
DELETE
在执行过程中,可以通过 cancelJob 或切断连接等方式中止删除;truncate
一旦开始执行,除非遇到不可预见的错误导致删除失败,无法中止。 -
由于
DELETE
会占用额外的磁盘空间,因此当磁盘空间紧张需要删除数据释放空间时,应使用truncate
。 -
有一个包含大量数据的分布式表:
-
如果要删除所有数据,应使用
truncate
; -
如果要删除部分数据,应先分析需要删除的数据,尽可能结合使用
dropPartiton
和DELETE
,或将某个分区中要保留的数据查到内存,dropPartition
后再将保留的数据写回。
-