更新时间:2024-06-11 GMT+08:00

是否有高效的删除表数据的方法?

有。删除大批量的日志数据时,使用delete语法需要花费更大的时间,此时可以通过TRUNCATE语法进行大批量删除操作,它的删除速度比delete快得多。

功能描述

清理表数据,TRUNCATE在清理表数据时,可以快速地从表中删除所有行。它和在目标表上进行无条件的DELETE有同样的效果,由于TRUNCATE不做表扫描,在大表上操作效果更明显,效率会提升很多。

功能特点

  • TRUNCATE TABLE在功能上与不带WHERE子句DELETE语句相同:二者均删除表中的全部行。
  • TRUNCATE TABLE比DELETE速度快且使用系统和事务日志资源少:
    • DELETE语句每次删除一行,并在事务日志中为所删除每行记录一项。
    • TRUNCATE TABLE通过释放存储表数据所用数据页来删除数据,并且只在事务日志中记录页的释放。
  • TRUNCATE,DELETE,DROP三者的差异如下:
    • TRUNCATE TABLE,删除内容,释放空间,但不删除定义。
    • DELETE TABLE,删除内容,不删除定义,不释放空间。
    • DROP TABLE,删除内容和定义,释放空间。

示例

  • 创建表。
    1
    CREATE TABLE tpcds.reason_t1 AS TABLE tpcds.reason;
    

    清空表tpcds.reason_t1。

    1
    TRUNCATE TABLE tpcds.reason_t1;
    

    删除表。

    1
    DROP TABLE tpcds.reason_t1;
    
  • 创建分区表。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    CREATE TABLE tpcds.reason_p
    (
      r_reason_sk integer,
      r_reason_id character(16),
      r_reason_desc character(100)
    )PARTITION BY RANGE (r_reason_sk)
    (
      partition p_05_before values less than (05),
      partition p_15 values less than (15),
      partition p_25 values less than (25),
      partition p_35 values less than (35),
      partition p_45_after values less than (MAXVALUE)
    );
    

    插入数据。

    1
    INSERT INTO tpcds.reason_p SELECT * FROM tpcds.reason;
    

    清空分区p_05_before。

    1
    ALTER TABLE tpcds.reason_p TRUNCATE PARTITION p_05_before;
    

    清空13所在的分区p_15。

    1
    ALTER TABLE tpcds.reason_p TRUNCATE PARTITION for (13);
    

    清空分区表。

    1
    TRUNCATE TABLE tpcds.reason_p;
    

    删除表。

    1
    DROP TABLE tpcds.reason_p;