朋友现在遇到一问题,希望高手能够帮忙,练练手!!

jjcrazy 2011-10-21 06:01:47
现有一张表(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表进行删除清理,能够清理最早的数据库数据。


...全文
128 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
007-x 2011-10-24
  • 打赏
  • 举报
回复
楼主要删除备份A表一个月的数据,一次性操作很慢的话可以考虑批量绑定FORALL,同时分批次进行,每次处理一个星期的资料,这样不会占用太大的内存.
jjcrazy 2011-10-24
  • 打赏
  • 举报
回复
ID不是序列的。 就是随机值,如 ggggxxxx,ggggxl1s 很恶心!

如果使用rowid, 因为该表可能会做更新或者是做rebuild index,这样就可能导致rowid 重置删除近期的数据
tiangtangcao 2011-10-22
  • 打赏
  • 举报
回复
如果只有A表,那么可以使用作业,该作业删除A本月之前的数据。

作业可参考:http://hi.baidu.com/isongyuan/blog/item/cba4e730d2d05eaf5fdf0e5e.html


发现从B表里取出一个月前的数据(200万左右),然后再到A表关联索引,做备份相关数据再删除

A表与B表是一对多的关系还是多对一的关系呢??

youshang444 2011-10-22
  • 打赏
  • 举报
回复
楼主,参考这个方法试试:http://www.cnblogs.com/rootq/archive/2009/01/31/1381718.html
采用顺序读A表,降低物理读!
iqlife 2011-10-22
  • 打赏
  • 举报
回复
顺便问下,你的A表里的ID如何的,序列?你的2个表关系如何的?通过ID关联?
2个ID是同步的?
iqlife 2011-10-22
  • 打赏
  • 举报
回复
没有日期就难办了,你这个表做删除很更新?如果不做的话,可以按照插入数据的顺序(rowid)来判断新旧数据,根据ROWID在不同数据块的存储,来删除ROWID小的数据,不过此前提是没有更新和删除,,因为删除和更新的话,可能造成新数据插入到被删除的空闲块中,ROWID就被重新使用了
jjcrazy 2011-10-22
  • 打赏
  • 举报
回复
设置10万删除数据还是要关联两张表处理, 关从6000万中搜索一条记录然后再另一张6000万的表中删除数据,这样的效率一定不成。

对于A表而言,没有日期这个字段,因此没有想好如何建立分区。 如果以Range方式对表建立分区,应该是有个条件的。 但是该表没有什么可以明确表现出的可分区的字段。
wangsj888 2011-10-22
  • 打赏
  • 举报
回复
如果可以,就重建。根据你要删除的条件,建立分区表。
定期把分区干掉就可以了
dut703 2011-10-22
  • 打赏
  • 举报
回复
1. 设置删除10万(视情况)提交一次。一次提交会产生很大的undo,对undo段有很大压力。
2. 新建表tmp,启用parallel,nologging,在建表时把不需要的数据过滤掉,然后rename tmp to A,重建索引,主键等。
jjcrazy 2011-10-22
  • 打赏
  • 举报
回复
可能误点在于。 A表是没有时间字段, 只有参数信息, 如姓名、年龄、地址等相关信息,没有写入到表的日期。 谢谢
jjcrazy 2011-10-22
  • 打赏
  • 举报
回复
A表与B表是一对一的关系,

朋友,你发的作业参考网站!看得不是很懂~~

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧