现在有一个存储过程是delete 某个oracle表里的记录.这个sp的逻辑很简单,就是根据时间删除记录.这个表的结构也很简单,但是可能是有两个column 是大数据,执行的性能很慢.请问大家如何能够提高这个sp的性能?
欢迎大家提出各种可能的方法,我会一一测试.
谢谢!

解决方案 »

  1.   

    1.对表加上相应的主键或索引.
    2.提高硬件配置.不过,大批量的delete其性能提高的可能性很小.
      

  2.   

    1. 首先确保delete 的where 查询要快,这个时候要考虑索引的问题,是否有合适的所以可以用?
    2.如果数据量很大,一定要考虑分批来delete,这一方面是为了考虑undo tablespace 的大小,另外也是分而治之的策略,一次的处理量少了之后,效率也会有很大提高;分批commit;比如,可以这样来设计:SQL> declare
      2  i  number;
      3  begin
      4  for i in 1..100 loop
      5  delete  from  test1 where rownum<=10;
      6  dbms_output.put_line(i);
      7  if (sql%rowcount <10 ) then
      8  commit;
      9  exit ;
     10  end if;
     11  commit;
     12  end loop;
     13  end;
     14  /
      

  3.   


    呵呵,如果对于要做的delete 操作的准确性都不能确保,还做什么啊?如果担心删错数据,必要的话先备份一下数据!
      

  4.   

    你的表空间如果是archive的, 记得加上with nolog
      

  5.   

    "但是可能是有两个column 是大数据" lob类型?
      

  6.   

    一般应用的表空间都是归档的, DDL操作有redo, arcihive日志, 所以删除操作慢, with nolog就是通知oracle不要生产日志, 缺点是以后无法利用日志恢复删除的数据.
      

  7.   

    同意
    分批刪除,有過經歷
    包括 插入大量數據也要適當分批commit
      

  8.   

    我也使用过分批commit,效果很好
      

  9.   

    删除对于两个column是大数据没有影响。又不是更新或插入。
      

  10.   

    你把你删除的sql语句或者存储过程贴出来
    然后再附上表结构和数据量
    最好我执行计划也贴出来!!!
      

  11.   

    用 bulk into/forall 试试
      

  12.   

    根据你说的情况,有可能是因为写重做日志 引起的性能问题。
    有以下办法,仅供参考:
    1、删除 前先把 在删除范围中记录的那2个字段值先update成空(可能充许的话,最好不好日志),再执行记录删除。
    2、避开系统使用高峰期做删除,可以先对要删除的记录只作删除标识,但不真正删除记录,=系统空闲时再做真正的删除。还有。如果你这个表经常做此类删除操作话,最好定期的对表进行空间压缩,一般的delete语句删除了记录,空间是不会回收的,碎片会越来越多。