您的位置:首页 > 数据库 > Oracle

Oracle truncate和delete的区别 (不积跬步,无以至千里)

2014-11-19 16:20 267 查看
删除整个表的数据用delete from table_name会产生大量的数据库日志记录,有时需要避免这些日志的产生,可以使用truncate

1、在功能上,truncate是清空一个表的内容,它相当于delete from table_name。

2、delete是dml操作,truncate是ddl操作;因此,用delete删除整个表的数据时,会产生大量的rollback, 占用很多的rollback segments(产生用于恢复的日志), 而truncate不会。

3、在内存中,用delete删除数据,表空间中其被删除数据的表占用的空间还在,便于以后的使用,另外它是 “假相”的删除,相当于windows中用delete删除数据是把数据放到回收站中,还可以恢复,当然如果这个时候重新启动系统(OS或者RDBMS),它也就不能恢复了!(如果立即做尾日志备份并且保证之前的日志链都ok的话,还是有可能恢复的)而用truncate清除数据,内存中表空间中其被删除数据的表占用的空间会被立即释放,相当于windows中用shift+delete删除数据,不能够恢复!(有日志也能恢复,只是不如回闪那么快了!)

4、truncate 调整high water mark 而delete不;truncate之 后,TABLE的HWM退回到 INITIAL和NEXT的位置(默认)delete 则不可以。

5、truncate 只能对TABLE,delete 可以是table,view,synonym。

6、TRUNCATE TABLE 的对象必须是本模式下的,或者有drop any table的权限 而 DELETE 则是对象必须是本模式下的,或被授 予 DELETE ON SCHEMA.TABLE 或DELETE ANY TABLE的权限。

7、在外层中,truncate或者delete后, 其占用的空间都将释放。

8、truncate和delete只删除数据,而drop则删除整个表(结构和数据)。

删除大数据表的方法参考:

1、先将不 需要删除的数据复制到一个临时表中

2、truncate table 表

3、将不需 要删除的数据复制回来。

不同:DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的的删除操作作为事务记录在日志中保存以便进行进行回滚操作。TRUNCATE TABLE 则一次性地从表中删除所有的数据页并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。

truncate的功能可以拆分为:dropping + re-creating a table,但truncate的效率要高。因为truncate无 须考虑表索引、约束、触发器等的重建。另外truncate执行后,无法回滚(roll back)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: