我有一个千W级的表, 定期要删除大约5%-30%的过期数据,   日期字段有索引, 如何提高删除速度?
目前试了存储过程中, 条件批量删除 , 和 分批选择rowid,按rowid 批量删除 ,效果都很差, 时间慢得无法忍受.
还需要考虑CPU 负载 和IOWAIT 问题.
不惜请各位牛人赐教.

解决方案 »

  1.   

    1 检查存储过程中的语句是否用上了时间索引,是否由于仍然是全表扫描导致慢,个人觉得用存储过程是比较好的办法2 按日期建分区表试试,好像是可以一下truncate一个分区,应该会很快
      

  2.   

    删除会产生大量的写REDO LOG FILE,
    直接使用DELETE命令进行删除,如果删除的数据量较大时,可能导致回滚段出错。这是因为在删除数据的过程中,
    不断扩展回滚段,直到回滚段的最大范围数
    或回滚段所在表空间空闲空间用完而出错。解决这个问题可以通过给删除数据的事务指定一个足够大的回滚段或者将回滚段所在表空间的AUTOEXTEND选项打开,同时将回滚段的MAXEXTENTS改大或设为UNLIMITED。不过这样仍存在一个隐患,如果删除的数据量大,同时数据库工作于归档模式下时,有可能导致日志切换频繁,所有日志文件都处于需要归档的状况,而归档进程来不及归档日志文件的情况出现,这时数据库将被挂起,直到有可用的日志文件后才恢复正常。 
    所以这种方法也不理想。 
    有人测试说:
    CREATE TABLE TT_NEW AS SELECT * FROM TT WHERE 需要保留的;DROP TABLE TT;RENAME TT_NEW TO TT;重建索引等对象这样会比较快点,我没试过。
      

  3.   


    [回1楼] 时间索引 加索引 非全表扫描, 已经用了存储过程 ;  重建日期分区, 要停机.
    [回5楼] REDO   LOG   FILE 不能解决问题; 
          CREATE   TABLE   TT_NEW   AS   SELECT   *   FROM   TT   WHERE   需要保留的
          建表很慢 , 弄外键, 索引什么的, 很麻烦
      

  4.   

    truncate table t;
    这样可提高速度