现有一张表(A表)没有日期字段-该表有6000万左右的数据,  
     另外有一张表(B表)与该表有索引关联也有6000万左右,     现需要对A表进行清理1个月以前的数据,但是发现从B表里取出一个月前的数据(200万左右),然后再到A表关联索引,做备份相关数据再删除,发现效率不高,为了提高效率,请问如何删除A表里面一个月以前的数据    如A表  --6000万以上
table A
(id   char(20),
 name char(40),
 age  integer
);
B表   --6000万以上
table B
( date  date,
  id    char(20),
  amount double(16,2),
  rmrk   char(50)
);    假定现在只有A表, 如何定期对A表进行删除清理,能够清理最早的数据库数据。

解决方案 »

  1.   

    如果只有A表,那么可以使用作业,该作业删除A本月之前的数据。作业可参考:http://hi.baidu.com/isongyuan/blog/item/cba4e730d2d05eaf5fdf0e5e.html
    发现从B表里取出一个月前的数据(200万左右),然后再到A表关联索引,做备份相关数据再删除A表与B表是一对多的关系还是多对一的关系呢??
      

  2.   

    1. 设置删除10万(视情况)提交一次。一次提交会产生很大的undo,对undo段有很大压力。
    2. 新建表tmp,启用parallel,nologging,在建表时把不需要的数据过滤掉,然后rename tmp to A,重建索引,主键等。
      

  3.   

         设置10万删除数据还是要关联两张表处理, 关从6000万中搜索一条记录然后再另一张6000万的表中删除数据,这样的效率一定不成。
         
         对于A表而言,没有日期这个字段,因此没有想好如何建立分区。  如果以Range方式对表建立分区,应该是有个条件的。  但是该表没有什么可以明确表现出的可分区的字段。
      

  4.   

    没有日期就难办了,你这个表做删除很更新?如果不做的话,可以按照插入数据的顺序(rowid)来判断新旧数据,根据ROWID在不同数据块的存储,来删除ROWID小的数据,不过此前提是没有更新和删除,,因为删除和更新的话,可能造成新数据插入到被删除的空闲块中,ROWID就被重新使用了
      

  5.   

    顺便问下,你的A表里的ID如何的,序列?你的2个表关系如何的?通过ID关联?
    2个ID是同步的?
      

  6.   

    楼主,参考这个方法试试:http://www.cnblogs.com/rootq/archive/2009/01/31/1381718.html
    采用顺序读A表,降低物理读!
      

  7.   

       ID不是序列的。 就是随机值,如 ggggxxxx,ggggxl1s 很恶心!
      
       如果使用rowid, 因为该表可能会做更新或者是做rebuild index,这样就可能导致rowid 重置删除近期的数据
      

  8.   

    楼主要删除备份A表一个月的数据,一次性操作很慢的话可以考虑批量绑定FORALL,同时分批次进行,每次处理一个星期的资料,这样不会占用太大的内存.