深入解析delete和truncate不同之处:

深入解析delete和truncate不同之处:
1.delete与trucate都用来删除表中的数据,那它们有什么不同之处呢?我先概要的将它们的不同之处说出,然后用测试依次来证实我所说的不同之处。
2.delete是DML操作,需要生undo成数据,在没有commit前可以回滚。truncate是DDL操作,不需要生成undo数据,也无法回滚。
3.delte操作并不降低水位线hwm,也就是无法释放被删除记录所占用的块空间,undo相反,降低hwm,释放被删除记录所占用的表空间。
4.在对整个表和索引进行完全浏览时,经过TRUNCATE操作后的表比DELETE操作后的表要快得多。
5.detele的执行速度要远远低于truncate,就像要求你把一本书扔掉,detele操作是一页一页撕下来,
 而truncate则是把整本书直接扔到垃圾桶,造成它们速度差距的根本原因除了有无undo数据的生成之外,
 和它们在块上的实现操作有关.
6.TRUNCATE不能触发任何DELETE触发器
7.不能授予任何人清空他人的表的权限
8.不能清空父表

1.=====> 对空间的影响
++++++++++++++++++++++++++++++++++++++++++++
 SQL> create table Tmall as select * from dba_objects;
Table created.
SQL> insert into Tmall select * from dba_objects;
75091 rows created.
SQL> /
75091 rows created.
SQL> /
75091 rows created.
SQL> /
75091 rows created.
                                                                                                                                          43
SQL> col SEGMENT_NAME for a10 
SQL> select segment_name, bytes/1024/1024  from dba_segments where  segment_name='TMALL';
SEGMENT_NA BYTES/1024/1024
---------- ---------------
TMALL                   43
SQL> select  count(*)  from dba_extents where segment_name='TMALL';
  COUNT(*)
----------
        58
============
SQL> delete from TMALL;
375455 rows deleted.
SQL> commit;
Commit complete.
SQL> select segment_name, bytes/1024/1024  from dba_segments where  segment_name='TMALL';
SEGMENT_NA BYTES/1024/1024
---------- ---------------
TMALL                   43
SQL> select  count(*)  from dba_extents where segment_name='TMALL';
  COUNT(*)
----------
        58
  
---&gt delete 掉后,表Tmall所占用的extent为58个.

SQL> truncate table TMALL;
Table truncated.
SQL> select segment_name, bytes/1024/1024  from dba_segments where  segment_name='TMALL';
SEGMENT_NA BYTES/1024/1024
---------- ---------------
TMALL                .0625
SQL> select  count(*)  from dba_extents where segment_name='TMALL';
  COUNT(*)
----------
         1
      
truncate:
 Truncate后块只有1.
由实验可见:delete操作不会释放空间,而Truncate操作会释放空间。Delete操作后,删除的是那个表数据腾出空间还只能被那个表使用并不让其它表使用.
====> 如何释放delete后仍占据的空间
SQL> delete from TMALL;
375455 rows deleted.
SQL> select count(*) from tmall;
  COUNT(*)
----------
         0
SQL> select  count(*)  from dba_extents where segment_name='TMALL';
  COUNT(*)
----------
        58
SQL> alter table Tmall move;
Table altered.
SQL> select  count(*)  from dba_extents where segment_name='TMALL';
  COUNT(*)
----------
         1
====> 比较两者所产生undo的测试
 
SQL>  create table Tmall as select * from dba_objects;
Table created.
SQL> select used_ublk,used_urec from v$transaction;
no rows selected
SQL> delete from Tmall;
75091 rows deleted.
SQL> select used_ublk,used_urec from v$transaction;
 USED_UBLK  USED_UREC
---------- ----------
      2197      75091
+++++++++++++++++++++++++++++++++++++++++++++++++++
delete 产生了大量的undo
SQL> create table Tmall as select * from dba_objects;
Table created.
SQL> select used_ublk,used_urec from v$transaction;
no rows selected
SQL> truncate table TMALL;
Table truncated.
SQL> select used_ublk,used_urec from v$transaction;
no rows selected
++++++++++++++++++
truncate 不产生undo.     
====> 比较两者所完成的时间
SQL> set timing on
SQL> delete from Tmall;
375455 rows deleted.
Elapsed: 00:00:13.72
SQL> truncate table Tmall;
Table truncated.
Elapsed: 00:00:00.25

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22578826/viewspace-749694/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22578826/viewspace-749694/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值