Oracle中Truncate和Delete的区别测试

1、TRUNCATE在各种表上无论是大的还是小的都非常快。如果有ROLLBACK命令Delete将被撤销,而TRUNCATE则不会被撤销。
2、TRUNCATE是一个DDL语言,向其他所有的DDL语言一样,他将被隐式提交,不能对TRUNCATE使用ROLLBACK命令。
3、TRUNCATE将重新设置高水平线和所有的索引。在对整个表和索引进行完全浏览时,经过TRUNCATE操作后的表比Delete操作后的表要快得多。
4、TRUNCATE不能触发任何Delete触发器。
5、不能授予任何人清空他人的表的权限。
6、当表被清空后表和表的索引讲重新设置成初始大小,而delete则不能。
7、不能清空父表。

TRUNCATE TABLE (schema)table_name Drop(REUSE) 

在默认是 Drop STORAGE 当使用Drop STORAGE时将缩短表和表索引,将表收缩到最小范围,并重新设置NEXT参数。REUSE STORAGE不会缩短表或者调整NEXT参数ITPUB个人空间;

在特殊情况下使用 REUSE STORAGE

一个实际应用的典型例子:你用sqlldr加载一个1000万记录的数据表,但是加载了多一半的时候你发现有问题,这个时候你想清空表重新加载。那么最好 reuse storage ,这样再次加载就不需要再次寻找空闲空间了。

 

 

 

 

 

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操作的结果更好。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/java2000_net/archive/2009/01/07/3728313.aspx

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值