Delete与trucate都用来删除表中的数据,那它们有什么不同之处呢?我先概要的将它们的不同之处说出,然后用测试依次来证实我所说的不同之处。
(1) delete是DML操作,需要生undo成数据,在没有commit前可以回滚。truncate是DDL操作,不需要生成undo数据,也无法回滚。
(2) delte操作并不降低水位线hwm,也就是无法释放被删除记录所占用的块空间,undo相反,降低hwm,释放被删除记录所占用的表空间。在对整个表和索引进行完全浏览时,经过TRUNCATE操作后的表比DELETE操作后的表要快得多。
(3) detele的执行速度要远远低于truncate,就像要求你把一本书扔掉,detele操作是一页一页撕下来,而truncate则是把整本书直接扔到垃圾桶,造成它们速度差距的根本原因除了有无undo数据的生成之外,和它们在块上的实现操作有关,而如何有关,我也是尚不清楚。
(4) TRUNCATE不能触发任何DELETE触发器
(5) 不能授予任何人清空他人的表的权限
(6) 不能清空父表
在理论上知道了它们的不同之处,那么来亲自实验测试一下吧,一定要养成敢于测试的习惯,也许我所讲述的某一点是错误的,而你不通过测试又无法发现,直接用于生产库而造成一些损失。更重要的是一种学习态度,只有经过自己测试的知识,才是自己的,安全可靠的。
1、 比较两种的空间释放情况:
1) delete:
可以看到delete后仍占用21个区2)truncate:
Truncate后只占有一个区
由实验可见: delete操作不会释放空间,而 Truncate操作会释放空间。 Delete操作后,删除的是那个表数据腾出空间还只能被那个表使用并不让其它表使用.
2、 比较两者所用时间
1)delete

2) truncate:
通过实验,可以看到,两者所用的时间,以及清除表中数据后,对表进行查询时,分别所用的时间。聪明的dba相信,很多时候都不会去选择使用delete ,truncate一定是一个很好的选择。不仅执行速度快,而且还会对删除之后的select操作有时间上的影响.
3、 比较两者所产生undo的测试
1)delete

2)truncate:

4、 如何释放delete后仍占据的空间
1)使用move命令:该命令是通过重新整理表的空间来达到释放的命令
至于delete后表空间的释放,除此之外还有其它方法,但因为本人的能力有限,这里暂时不进行讨论,还希望熟悉的朋友能够留言进行讨论,谢谢。
delete和truncate的测试就做到这里了,但其实还有很多需要进行测试。图片可能有点小,只好点击看大图啦。确实有些不方便。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/27425054/viewspace-749401/ ,如需转载,请注明出处,否则将追究法律责任。