解决方案 »

  1.   

    我觉得还是用oracle自身的方式比较好,
    毕竟在数据检索方面,我们都没有oracle专业
    数据量较大,删除时可以考虑采用分批处理
    每批次多少根据自身数据库的环境设置
      

  2.   

    看了公司的一个数据库的一个表,单表占用了190G,你这个表100多T,估计这1个表估计就得几十个T吧,这么大的表,应该采用分区表技术,如果是这样,可以现在某个分区内去重,然后再总的去重
      

  3.   

    100多T啊,我觉得Oracle很难担得起,备份估计是别想了。
    不过如果去重的话,仅靠几条SQL是不行的,可能需要新建个表把关键列分段提取出来以减少尺寸,必要的时候可以可以用哈希算法把关键列的组合哈希一下。然后可以考虑用bloom filter算法把数据作粗过滤排除掉绝大部分不重复的数据,然后对可能重复的数据再作一次过滤。
      

  4.   

    数据量确实非常大,至于是哪里的数据库不太好回复,请大家还是更关注问题本身吧。有没有可能考虑将数据库导出至hdfs,采用hadoop处理呢,分区也考虑过,可是这么大的数据库,分区也不是说分就分的,实际操作起来还是非常复杂,其可用性也待考究。
      

  5.   

    说一下我的想法吧,也不一定是最好的方案
    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至于应该划分多少个分区,不好说,看情况吧,一点点测试吧这么大的数据量修改结构或是增加索引都不太现实,只能利用现有状况进行处理,确实让人头大
      

  6.   


    嗯,确实如此,谢谢解答,分区 去重 再 merge的方法确实是现在为数不多的方案之一
      

  7.   

    非Oracle的方法:     分配 1G的内存,每一个bit代表一个ID[需要用算法将ID映射到0-100亿的整数空间]。 从数据库读取ID,填冲到内存对应位上,如果是 0-1 ,那么是正常,如果是1-1,那么ID重复,输出到计数程序或文件。 数据读取完成后,检查整个空间,值为0的bit位,是缺失的ID。 
        逻辑简单,可以做成分布式程序,快速计算。
      

  8.   

    你的意思是放着oracle的快速检索功能不用,自己检索?
      

  9.   

    你的意思是放着oracle的快速检索功能不用,自己检索?B+数的检索效率并没有达到理想化的程度,并不适合做楼主要求的事情。    
      

  10.   

    这个表的索引肯定在100G以上,能够把索引文件遍历一遍,负担就相当大了。  用27楼的算法,可以在遍历一遍索引不进行任何数值比较(位上的比较还是有的)的情况下得到结果。 效率不能再高了。    
    如果数据量超过200亿条,就须要建立分区逻辑,和22楼的思想类似,在多台机器上跑,然后归并。[就是hadoop的思想哈]