删除数据
SQL 语句
可以使用 delete 语句从表中删除数据:
DELETE FROM <table> WHERE ...
注:
- 此方法也可用于删除内存表的数据。
- 使用
DELETE
语句删除,会首先根据WHERE
子句过滤,将相关分区的数据加载到内存,然后删除特定数据,再将其余数据写回数据库。为了实现多版本并发控制,会将此版本数据存储在磁盘上的另一个文件。这样可以确保在删除完成前,用户仍可以查询相关数据,且一定是完整的删除前的数据。因此此时磁盘占用可能会高于删除前。当一段时间后旧版本回收删除时,磁盘空间就可以释放。因此使用DELETE
语句删除分布式表的数据,需要有足够的内存和磁盘空间。如果希望立刻回收旧版本以释放磁盘空间,可以通过函数实现。 WHERE
子句的过滤条件应当对分区字段做明确限定,如果没有,则会将所有分区的数据加载到内存处理,容易造成内存资源紧张。
truncate
truncate 可以删除分布式表中的所有数据,但表结构会得到保留。此函数仅可用于删除分布式表的数据。
该函数在性能方面较 DELETE
语句以及 dropPartition
均有数倍提升。
注意:
- 当有一个查询正在进行时,使用
DELETE
语句删除该表数据不会影响此查询,truncate
会导致查询失败。 DELETE
在执行过程中,可以通过 cancelJob 或切断连接等方式中止删除;除非遇到不可预见的错误导致删除失败,truncate
一旦开始执行,无法中止。- 由于
DELETE
会占用额外的磁盘空间,因此当磁盘空间紧张需要删除数据释放空间时,应使用truncate
。 - 如果有一个包含大量数据的分布式表,如果要删除所有数据,应使用
truncate
;如果要删除部分数据,应先分析需要删除的数据,尽可能结合使用dropPartiton
和DELETE
,或将某个分区中要保留的数据查到内存,dropPartition
后再将保留的数据写回。 - 删除数据需要执行用户具有相应权限,否则无法删除。关于删除权限,参考:用户权限管理。