删除数据

SQL 语句

可以使用 delete 语句从表中删除数据:

DELETE FROM <table> WHERE ...
注:
  • 此方法也可用于删除内存表的数据。
  • 使用 DELETE 语句删除,会首先根据 WHERE 子句过滤,将相关分区的数据加载到内存,然后删除特定数据,再将其余数据写回数据库。为了实现多版本并发控制,会将此版本数据存储在磁盘上的另一个文件。这样可以确保在删除完成前,用户仍可以查询相关数据,且一定是完整的删除前的数据。因此此时磁盘占用可能会高于删除前。当一段时间后旧版本回收删除时,磁盘空间就可以释放。因此使用 DELETE 语句删除分布式表的数据,需要有足够的内存和磁盘空间。如果希望立刻回收旧版本以释放磁盘空间,可以通过函数实现。
  • WHERE 子句的过滤条件应当对分区字段做明确限定,如果没有,则会将所有分区的数据加载到内存处理,容易造成内存资源紧张。

truncate

truncate 可以删除分布式表中的所有数据,但表结构会得到保留。此函数仅可用于删除分布式表的数据。

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

注意

  • 当有一个查询正在进行时,使用 DELETE 语句删除该表数据不会影响此查询,truncate 会导致查询失败。
  • DELETE 在执行过程中,可以通过 cancelJob 或切断连接等方式中止删除;除非遇到不可预见的错误导致删除失败,truncate 一旦开始执行,无法中止。
  • 由于 DELETE 会占用额外的磁盘空间,因此当磁盘空间紧张需要删除数据释放空间时,应使用 truncate
  • 如果有一个包含大量数据的分布式表,如果要删除所有数据,应使用 truncate;如果要删除部分数据,应先分析需要删除的数据,尽可能结合使用 dropPartitonDELETE,或将某个分区中要保留的数据查到内存,dropPartition 后再将保留的数据写回。
  • 删除数据需要执行用户具有相应权限,否则无法删除。关于删除权限,参考:用户权限管理