orcl 如何快速删除表中百万或千万数据
orcl 数据库表中数据达到上千万时,已经变的特别慢了,所以时不时需要清掉一部分数据。
bqh8表中目前有10000000条数据,需要保留19条数据,其余全部清除掉。
以下为个人方法:
1、首先把需要保留的数据备份到temp1临时表中。
create table temp1 as select * from bqh8 where id<20;
select * from temp1;
2、然后再用truncate删除整个表的数据。
truncate table bqh8;
select * from bqh8;
3、最后再把temp1表中的数据复制到bqh8表中。
insert into bqh8 select * from temp1;
commit;
select * from bqh8;
--------------------------------------------------------------------------------------------------
有人说删除数据尽量不要用truncate,但是truncate命令速度快,占用资源少,方面快捷,如果你确定表中数据完全可以删除的话可以用此命令。如果表中部分数据有用,那你最后备份好,否则一旦使用此命令,就呵呵了, 当然你也可以用delete。但删除少量数据效率还行,若是几百万甚至几千万效率特别低,各有利有弊。根据实际情况而选。当然delete命令还是有好处的,如果不能保证此后的数据有不有用,但是当前不知道,或者干脆就是误删了,那么使用rollback命令直接回滚,当然rollback命令可以添加回滚点,定位回滚,恢复数据比较方便,所以说对与初学者,小柏强烈建议大家删除数据时使用delete命令,虽然效率低一点,但是加保险了,亲身经历,误用truncate命令清空了一个表,还好这个表是无关紧要的,否则我就只能呵呵受惩罚了。当然,强烈的建议是,做任何操作前,对于有用的数据都要事先备份,有备无患。
下面介绍一下truncate与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则删除整个表(结构和数据)。
-----------------------------------------------------------------------------------------------