Oracle中Truncate和Delete的区别


Truncate和Delete的测试

  1 一个只有一列的最简单的表

  SQL> desc t;

  名称 是否为空? 类型

  ----------------------------------------- -------- ----------------------------

  A VARCHAR2(200)

  2 清理以前的数据

  SQL> truncate table t;

  表被截断。

  3 打开时间显示

  SQL> set timing on;

  4 查看当前情况

SQL> select count(*) from t;
COUNT(*)
----------
0

  已用时间: 00: 00: 00.00

  5 向里面插入100万数据

SQL> begin
2 for i in 1 .. 1000000
3 loop
4 insert into t values(i);
5 end loop;
6 end;
7 /

  PL/SQL 过程已成功完成。

  已用时间: 00: 00: 34.42

  6 检查数据情况,注意使用的时间在0.03秒左右

  SQL> select count(*) from t;

  COUNT(*)

  ----------

  1000000

  已用时间: 00: 00: 00.03

  SQL> select count(*) from t;

  COUNT(*)

  ----------

  1000000

  已用时间: 00: 00: 00.03

  7 提交

  SQL> commit;

  提交完成。

  已用时间: 00: 00: 00.00

  8 再次测试,在0.02秒左右

  SQL> select count(*) from t;

  COUNT(*)

  ----------

  1000000

  已用时间: 00: 00: 00.03

  9 删除所有的数据

  SQL> delete from t;

  已删除1000000行。

  已用时间: 00: 00: 23.71

  10 再次测试,大约在0.01秒左右

  SQL> select count(*) from t;

  COUNT(*)

  ----------

  0

  已用时间: 00: 00: 00.01

  SQL> select count(*) from t;

  COUNT(*)

  ----------

  0

  11 截断表

  SQL> truncate table t;

  表被截断。

  已用时间: 00: 00: 00.29

  12 再次查询,用时为0

  SQL> select count(*) from t;

  COUNT(*)

  ----------

  0

  已用时间: 00: 00: 00.00

  SQL> select count(*) from t;

  COUNT(*)

  ----------

  0

  已用时间: 00: 00: 00.00

  SQL>

  13 结论

  数据被删除后,高水平线(high-water mark,HWM)并没有复位只是那些空间不再使用而已,再次查询依然会读取HWH以前的块查找是否有可用的数据。而截断表将复位HWH,告诉这些空间没有保存数据。

  所以,如果允许截断表(注意:会产生事务提交),则truncate操作比delete操作的结果更好


« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3