Delete,Truncate和Drop

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操作速度也会有提升。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值