Oracle清空表truncate详述
- 清空整张表,不能回滚,不会产生大量日志文件;
- 表空间会得到释放;
- 会同时更新索引;
- 权限:TRUNCATE TABLE 的对象必须是本模式下的,或者有drop any table的权限
- TRUNCATE TABLE TB_TABLE_NAME;
truncate是oracle中独有的关键字吧!它的作用是清空一个表格,在删除数据方面,其与delete有一些区别。
1、在功能上,truncate是清空一个表的内容,它相当于delete from table_name。
2、delete是dml操作,truncate是ddl操作;因此,用delete删除整个表的数据时,会产生大量的roolback,占用很多的rollback segments, 而truncate不会。
3、在内存中,用delete删除数据,表空间中其被删除数据的表占用的空间还在,便于以后的使用,另外它是“假相”的删除,相当于windows中用 delete删除数据是把数据放到回收站中,还可以恢复,当然如果这个时候重新启动系统(OS或者RDBMS),它也就不能恢复了!
而用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则删除整个表(结构和数据)。
2、delete是dml操作,truncate是ddl操作;因此,用delete删除整个表的数据时,会产生大量的roolback,占用很多的rollback segments, 而truncate不会。
3、在内存中,用delete删除数据,表空间中其被删除数据的表占用的空间还在,便于以后的使用,另外它是“假相”的删除,相当于windows中用 delete删除数据是把数据放到回收站中,还可以恢复,当然如果这个时候重新启动系统(OS或者RDBMS),它也就不能恢复了!
而用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. Truncate Table语句是一种相对快速,无Log记录的方法,它等同于不含Where子句的Delete语句,至少表面上看来功能上相同,但Truncate Table的速度更快,并且使用更少的System Resource和Transaction Log Resource。
2. Truncate语句所使用的Log Tablespace较少。Delete语句每删除一行Record,都需要在Log中为每一个所删除的行进行记录,但是Truncate是通过释放用于Store Data的数据Page来删除数据,在LOong中只需要记录Page释放。
3. Truncate语句所使用的Lock较少。Delete语句始终锁定Table中的各行,而Truncate始终锁定Table本身和Page本身,不是Table中的各行。
4. Truncate语句通常不会在所删除的Table中留有空页。Delete语句执行后,Table中仍然会保留空页,而且必须至少使用一个排他表 锁,LCK_M_X,才能释放堆中的空表,否则执行完Delete操作后,表或堆中会包含相当多的空页或空表,而且对于Index,Delete操作同样 会留下一些空页。而Truncate操作后,只是会在DB而不是Table中保留一些相关的信息。