zoukankan      html  css  js  c++  java
  • 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则删除整个表(结构和数据)。

    -----------------------------------------------------------------------------------------------

    TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。
     
    DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
     
    TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。
     
    如果想保留标识计数值,请改用 DELETE。
     
    如果要删除表定义及其数据,请使用 DROP TABLE 语句。
  • 相关阅读:
    css-box-shadowing
    css- :before :after
    css: line-height 与box-sizing
    金蝶数据库后台追踪
    钉钉审批开发,空白内容
    asp.net c#语言实现钉钉鉴权验证
    钉钉事件回调c#测试完成
    钉钉C#发起审批实例demo
    asp.net c#语言实现钉钉鉴权验证
    图片码
  • 原文地址:https://www.cnblogs.com/su-root/p/9801319.html
Copyright © 2011-2022 走看看