ORACLE 海量数据去重 查缺 处理,求Oracle解答

Darkingp 2014-08-29 12:04:17
加精
问题是这样,现在有一个100多TB的Oracle数据库,其中最大表有几百亿条记录,但是这些记录有重复的,有缺失的,现在希望能够去重,并且找到缺失的记录(有一定的查询缺失记录的规则),主要问题还是先针对去重,请问有什么可行的办法,数据量特别大,因此直接用Oracle本身的去重功能可能不太适用。求各位大牛DBA大哥们给点指导,感激不尽!
...全文
5444 36 打赏 收藏 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
哦呦喂 2016-05-25
  • 打赏
  • 举报
回复
我建议是用抽取工具DataStage,新建一张表对表进行分区和子分区,然后通过抽取工具去重抽取,大概每秒5000条左右。通过工具可以实现去重, 按照目前数据库的方式去重是无法实现的。数据量太大。数据库完成不了。
CCwings 2015-05-18
  • 打赏
  • 举报
回复
坐等大神出现
^8^ 2014-09-04
  • 打赏
  • 举报
回复
focus ...........
GW786228836 2014-09-04
  • 打赏
  • 举报
回复
Darkingp 2014-09-03
  • 打赏
  • 举报
回复
再顶下 大家讨论起来
okkk 2014-09-03
  • 打赏
  • 举报
回复
这个表的索引肯定在100G以上,能够把索引文件遍历一遍,负担就相当大了。 用27楼的算法,可以在遍历一遍索引不进行任何数值比较(位上的比较还是有的)的情况下得到结果。 效率不能再高了。 如果数据量超过200亿条,就须要建立分区逻辑,和22楼的思想类似,在多台机器上跑,然后归并。[就是hadoop的思想哈]
okkk 2014-09-03
  • 打赏
  • 举报
回复
引用 28 楼 bw555 的回复:
[quote=引用 27 楼 okkk 的回复:] 非Oracle的方法: 分配 1G的内存,每一个bit代表一个ID[需要用算法将ID映射到0-100亿的整数空间]。 从数据库读取ID,填冲到内存对应位上,如果是 0-1 ,那么是正常,如果是1-1,那么ID重复,输出到计数程序或文件。 数据读取完成后,检查整个空间,值为0的bit位,是缺失的ID。     逻辑简单,可以做成分布式程序,快速计算。
你的意思是放着oracle的快速检索功能不用,自己检索?[/quote] B+数的检索效率并没有达到理想化的程度,并不适合做楼主要求的事情。
bw555 2014-09-02
  • 打赏
  • 举报
回复
引用 27 楼 okkk 的回复:
非Oracle的方法: 分配 1G的内存,每一个bit代表一个ID[需要用算法将ID映射到0-100亿的整数空间]。 从数据库读取ID,填冲到内存对应位上,如果是 0-1 ,那么是正常,如果是1-1,那么ID重复,输出到计数程序或文件。 数据读取完成后,检查整个空间,值为0的bit位,是缺失的ID。     逻辑简单,可以做成分布式程序,快速计算。
你的意思是放着oracle的快速检索功能不用,自己检索?
okkk 2014-09-02
  • 打赏
  • 举报
回复
非Oracle的方法: 分配 1G的内存,每一个bit代表一个ID[需要用算法将ID映射到0-100亿的整数空间]。 从数据库读取ID,填冲到内存对应位上,如果是 0-1 ,那么是正常,如果是1-1,那么ID重复,输出到计数程序或文件。 数据读取完成后,检查整个空间,值为0的bit位,是缺失的ID。     逻辑简单,可以做成分布式程序,快速计算。
bw555 2014-09-01
  • 打赏
  • 举报
回复
引用 24 楼 w892523157 的回复:
添加标识,由关键字段及标识组成新表,添加所有记录后索引,通过比较删除重复记录,通过标识添加记录生成新的数据记录。
100多个T的表这么整,增加新表,增加索引,要完成操作用多少时间先不说,这么做至少还需要50个T左右的存储,这个硬件开销貌似有点大啊
w892523157 2014-09-01
  • 打赏
  • 举报
回复
添加标识,由关键字段及标识组成新表,添加所有记录后索引,通过比较删除重复记录,通过标识添加记录生成新的数据记录。
Jane_314 2014-09-01
  • 打赏
  • 举报
回复
你可以倒到测试库中,在分析
hyee 2014-08-30
  • 打赏
  • 举报
回复
100多T啊,我觉得Oracle很难担得起,备份估计是别想了。 不过如果去重的话,仅靠几条SQL是不行的,可能需要新建个表把关键列分段提取出来以减少尺寸,必要的时候可以可以用哈希算法把关键列的组合哈希一下。然后可以考虑用bloom filter算法把数据作粗过滤排除掉绝大部分不重复的数据,然后对可能重复的数据再作一次过滤。
twtiqfn 2014-08-30
  • 打赏
  • 举报
回复
怎么有这么大的数据量啊
Darkingp 2014-08-30
  • 打赏
  • 举报
回复
引用 22 楼 bw555 的回复:
说一下我的想法吧,也不一定是最好的方案 1、先将现有数据划分为N个分区 如果此表为分区表,可直接利用分区表的分区划分 不是分区表的话建议按照rowid进行分区,按rowid检索的速度应该是最快的 2、先将每个分区分别自己内部去重 3、然后两两组合去重 1和2、1和3、1和4……1和N 2和3、2和4、2和5……2和N …… N-1和N 至于应该划分多少个分区,不好说,看情况吧,一点点测试吧 这么大的数据量修改结构或是增加索引都不太现实,只能利用现有状况进行处理,确实让人头大
嗯,确实如此,谢谢解答,分区 去重 再 merge的方法确实是现在为数不多的方案之一
bw555 2014-08-30
  • 打赏
  • 举报
回复
说一下我的想法吧,也不一定是最好的方案 1、先将现有数据划分为N个分区 如果此表为分区表,可直接利用分区表的分区划分 不是分区表的话建议按照rowid进行分区,按rowid检索的速度应该是最快的 2、先将每个分区分别自己内部去重 3、然后两两组合去重 1和2、1和3、1和4……1和N 2和3、2和4、2和5……2和N …… N-1和N 至于应该划分多少个分区,不好说,看情况吧,一点点测试吧 这么大的数据量修改结构或是增加索引都不太现实,只能利用现有状况进行处理,确实让人头大
Darkingp 2014-08-30
  • 打赏
  • 举报
回复
引用 2 楼 bw555 的回复:
我觉得还是用oracle自身的方式比较好, 毕竟在数据检索方面,我们都没有oracle专业 数据量较大,删除时可以考虑采用分批处理 每批次多少根据自身数据库的环境设置
我觉得目前的情况,分区肯定得分区,但具体方案如何设计还是有问题,不知仁兄有何高见。
Darkingp 2014-08-30
  • 打赏
  • 举报
回复
引用 1 楼 wildwave 的回复:
这个有点麻烦,典型的为设计问题埋单。推荐一下,看看谁有好办法
谢版主推荐
Darkingp 2014-08-30
  • 打赏
  • 举报
回复
数据量确实非常大,至于是哪里的数据库不太好回复,请大家还是更关注问题本身吧。 有没有可能考虑将数据库导出至hdfs,采用hadoop处理呢,分区也考虑过,可是这么大的数据库,分区也不是说分就分的,实际操作起来还是非常复杂,其可用性也待考究。
zhongshaoguo 2014-08-30
  • 打赏
  • 举报
回复
呵呵,来凑个热闹。不知道楼主这100个T重复的概率有多大,说不定去去重只剩下几个T了呢? 比较好奇的是,现在这个表执行查询还能跑的动吗?
加载更多回复(14)

3,499

社区成员

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

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