Delete和Truncate是删除表数据,不包括表结构,删除数据后,所建的表和表结构,索引,约束等都还在。
Drop是不但删除表数据,连带表结构一起删除。即Drop Table后,不但数据清除了连这个表也删掉了。Drop后无法恢复删除的表对象和数据。
我们下面单说下Delete和Truncate,它们都可以对DB中数据表的数据进行清除,但是它们之间是有差异的,适用场景也有所区别,我们可以从下面几点进行比较说明:
1)Delete是数据操作语言(DML - Data Manipulation Language),操作时原数据会被放到 rollback segment中,可以被回滚;
truncate是数据定义语言(DDL - Data Definition Language),操作时不会进行存储,不能进行回滚。
在内存中,delete删除的数据,表空间中被删除数据的表占用的空间还在,便于以后的使用,我们可以看作它是“假”删除,表象上看似删除了其实是把数据放到了一个类似回收站的地方,rollback时还可以以恢复,当然如果这个时候重新启动系统(OS或者RDBMS),它也就不能恢复了!
而用truncate删除的数据,内存中表空间中其被删除数据的表占用的空间会被立即释放,不能够恢复!
引申解释下DML和DDL:
DML是数据操作语言,是对数据库的基本操作,即增删改查。比如:select、update、delete、insert、merge。
DDL(Data Definition Language)数据定义语言,是定义和管理 SQL 数据库中的所有对象的语言,对数据库中的某些对象(例如,database,table)进行管理。比如:create、alter、drop、truncate、comment、grant、revoke。
它们两个的区别主要是DML可以手动控制事务的开启,提交和回滚等。而DDL的操作是不可以rollback的。
2)Delete删除表数据可以添加where条件进行删除某条或某些数据。而Truncate只能清空整表数据。
3)从删除效率上看,两者有些差异。
数据量比较小的情况下,delete和truncate的删除数据的速度差别不大。但是数据量很大时,truncate就比delete的删除速度块。这是因为,truncate是直接清空表中所有记录且不需要支持回滚,它使用的系统和事务日志资源少。而delete 语句是逐行删除,每删除一行就会在事务日志中为该行记录一项,所以清数比较慢,但是相对来说也较安全。
4)关于高水位线
随着不断地进行表记录的DML操作,会不断提高表的高水位线(HWM),delete操作之后虽然表的数据删除了,但是并没有降低表的高水位,随着DML操作数据库容量也只会上升,不会下降。所以如果使用delete,就算将表中的数据减少了很多,在查询时还是很和delete操作前速度一样。
而truncate操作会重置高水位线,数据库容量也会被重置,之后再进行DML操作速度也会有提升。
4691

被折叠的 条评论
为什么被折叠?



