上亿级数据量的数据库表数据清理

coff_cola 2018-10-22 01:02:58
想要做一个数据库表清理的测试,清理A表里面不在B表且不C表的数据。这三个表有一个相同的字段ID做主键。我写了个存储过程,大概思路是先把要删除的数据查询出来放在游标里,然后打开游标循环delete A where A.ID =游标变量.ID,每5000条提交一次。这三个表的数据都在3亿条左右。想问大家有没有别的思路?或者用什么方式查询能最大效率执行查询这一步?
...全文
561 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
超叔csdn 2018-11-11
  • 打赏
  • 举报
回复
这个主要是要看是你删除的数据量多,还是保留的数据量多。
如果保留的数据量少,建议将结果数据写入一张新表再迁移回来。

原则上不建议对大量数据使用游标,效率会比sql的方式低很多。
aaaa_007 2018-11-09
  • 打赏
  • 举报
回复
还是要看b和c表的数据量,如果只是a表量大,b和c较小的话,可用把切割a表进行处理
通过不同条件查询,生成建临时表,再汇聚
例如
select * from a where not exists (select 1 from b where a.id=b.id) and not exists (select 1 from c where a.id=c.id) and mod(a.id,10)=0;

yaiger 2018-10-23
  • 打赏
  • 举报
回复
这种大表不能做成分区表吗?删除分区效率高很多
yaiger 2018-10-23
  • 打赏
  • 举报
回复
要删除的数据量有多少?要保留的数据有多少?
如果删除的量要比保留的大很多,可以考虑全部删除后重新插入的做法
Rotel-刘志东 2018-10-22
  • 打赏
  • 举报
回复
放游标里的效率不会太高的,临时表是一个好的方案,做标记删除还是可以的。
  • 打赏
  • 举报
回复
放游标里面 ,感觉不如放临时表里面,然后加一个flag字段,批量删除,和更改flag值

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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