我在oracle中对一个表进行删除操作,该表中至少有几百万条记录,每次删除几十万条记录,每1000条commit一次。
在删除的过程中和删除完成的一段时间内,会发生oracle响应非常慢的情况,无论是连接还是查询。
我该如何查找原因?
怎么解决?

解决方案 »

  1.   

    删除大量数据,删除操作要写UNDO和REDO,要消耗CPU和IO,影响其它DML正常的。
    另外你的删除语句有没有利用到索引,效率如何?
    最好贴出SQL和执行计划!!
      

  2.   

    删除大量数据,删除操作要写UNDO和REDO,要消耗CPU和IO,影响其它DML正常的。
    另外你的删除语句有没有利用到索引,效率如何?
    最好贴出SQL和执行计划!!
      

  3.   

    删除大量数据,删除操作要写UNDO和REDO,要消耗CPU和IO,影响其它DML正常的。
    另外你的删除语句有没有利用到索引,效率如何?
    最好贴出SQL和执行计划!!
      

  4.   

    1. 用到了索引
    2. 效率:9000条/秒我是用的存储过程,sql不方便贴出,工作机不能上网。
    sql语句并不复杂,类似:
    delete from table1 t
    where t.time between sysdate - 10 and sysdate - 9
      

  5.   

    使用V$SQL视图看看执行情况。还有v$sesstat v$statname v$session等等
      

  6.   

    在sqlplus下查询这几个视图或表就行了
      

  7.   

    建言删除时使用nologging关键字,不保留日志,能快一点
      

  8.   


    试验失败!
    日志对性能影响很小。2. 效率:9000条/秒(一开始能达到,性能很快会下降到9000条/分钟)
    是oralce在重建索引而占用的大量的系统资源吗?
    怎么查?
      

  9.   

    如果表可以按时间分区的话,就可以直接truncate分区.
      

  10.   

    alter table table_name deallocate;
    刚查了一下 试下上面的语句
      

  11.   

    alter table table_name  shrink space;
      

  12.   

    select sql_text,executions,buffer_gets,disk_reads from v$sql;
    其中 cpu使用对应的是buffer_gets,磁盘io使用对应的是disk_reads.
      

  13.   


    同意这个观点。可以先对表进行分区处理,然后truncate分区
      

  14.   

    csdn中有位高手说between...and ...这个效率的问题,找不到他个帖子了.
      

  15.   


    分区比较麻烦,能够自动分区吗?
    慢的原因是不是要写大量的undo和redo,以及索引重建上了?
      

  16.   

    在网上百度了下,看到了这个帖子,不知道你是否试过?
    http://www.chinabyte.com/biz/cbfwq/82/2679582.shtml
      

  17.   

    当使用delete进行删除数据时,对应表的高水位线并不会下降,也就是说当你查询时还是相当于在你之前的总记录数当中进行数据查询,所以会慢;我觉得这是一个原因!
    同意楼上那些大牛的观点,可以采用分区表,然后直接truncate操作应该就能解决问题了;
      

  18.   

    感谢各位大牛的回复!
    有些方法可行,单比较麻烦。
    因为数据清理工作没有时间上的限制,所以采用每删除一定量的数据就sleep一段时间,给数据库做维护工作的时间。这样做就不会导致高水位线的问题,只不过数据清理的时间会比较长。