delete

delete语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中以便进行回滚操作

delete操作不会减少表或索引所占用的空间

delete可根据条件删除表中满足条件的数据,如果不指定where子句,那么删除表中所有记录

delete语句为DML(data maintain Language),这个操作会被放到 rollback segment中,事务提交后才生效。如果有相应的 tigger,执行的时候将被触发

truncate

truncate table 一次性从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的,并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。

表被truncate后,这个表和索引所占用的空间会恢复到初始大小

truncate 不能用于参与了索引视图的表。

drop

drop不会触发触发器

drop语句删除表结构及所有数据,并将表所占用的空间全部释放

drop语句将删除表的结构所依赖的约束,触发器,索引,依赖于该表的存储过程/函数将保留,但是变为invalid状态。

总结

1、在速度上,一般来说,drop>truncate>delete

2、在使用drop和truncate时一定要注意,虽然可以恢复,但为了减少麻烦,还是要慎重。

3、如果想删除部分数据用delete,注意加上where条件;

4、如果想删除表,使用drop

5、如果想保留表而将所有数据删除,若和事务无关,用truncate即可;若和事务有关,或者想触发trigger,还是用delete

6、如果是整理表内部的碎片,可以使用truncate跟上reuse storage,再重新导入/插入数据。

7、truncate、drop是DLL(data define language),操作立即生效,原数据不放到 rollback segment中,不能回滚