深入解析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.不能清空父表
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';
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
---------- ---------------
TMALL 43
SQL> select count(*) from dba_extents where segment_name='TMALL';
COUNT(*)
----------
58
----------
58
============
SQL> delete from TMALL;
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
---------- ---------------
TMALL 43
SQL> select count(*) from dba_extents where segment_name='TMALL';
COUNT(*)
----------
58
---> delete 掉后,表Tmall所占用的extent为58个.
----------
58
---> 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
---------- ---------------
TMALL .0625
SQL> select count(*) from dba_extents where segment_name='TMALL';
COUNT(*)
----------
1
truncate:
----------
1
truncate:
Truncate后块只有1.
由实验可见:delete操作不会释放空间,而Truncate操作会释放空间。Delete操作后,删除的是那个表数据腾出空间还只能被那个表使用并不让其它表使用.
====> 如何释放delete后仍占据的空间
SQL> delete from TMALL;
SQL> delete from TMALL;
375455 rows deleted.
SQL> select count(*) from tmall;
COUNT(*)
----------
0
----------
0
SQL> select count(*) from dba_extents where segment_name='TMALL';
COUNT(*)
----------
58
----------
58
SQL> alter table Tmall move;
Table altered.
SQL> select count(*) from dba_extents where segment_name='TMALL';
COUNT(*)
----------
1
----------
1
====> 比较两者所产生undo的测试
SQL> create table Tmall as select * from dba_objects;
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
---------- ----------
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.
truncate 不产生undo.
====> 比较两者所完成的时间
SQL> set timing on
SQL> delete from Tmall;
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/