日期:2014-05-16  浏览次数:20829 次

一个1.5亿条记录的表如何建立主键
各位大虾:我客户有一个非常大的表,目前有1.5亿条记录,而且还在以每月两千万的速度增加。由于当时设计不够合理,目前这个表是没有主键,也没有分区的。
  现在我要对其进行优化,分区是肯定要的了,但我首先得建立主键(四个字段的联合主键),但又由于数据错误,里面大概有一千万条重复记录,所以需要先删除这一千万条记录。
  多次使用sql语句删除未能成功(数小时执行不完)
  delete from table t where exist(select v.* from table v where <主键字段相等> and t.rowid<v.rowid)
   
  后来就新建了一个表把重复记录的rowid 保存下来,有一千多万条记录,现在简单点了,直接匹配rowid删除。可两个巨大的表联结或者说匹配是个非常痛苦的事,每次执行还是遥遥无期。
  特此向各位大虾求救!


------解决方案--------------------
探讨
各位大虾:我客户有一个非常大的表,目前有1.5亿条记录,而且还在以每月两千万的速度增加。由于当时设计不够合理,目前这个表是没有主键,也没有分区的。
现在我要对其进行优化,分区是肯定要的了,但我首先得建立主键(四个字段的联合主键),但又由于数据错误,里面大概有一千万条重复记录,所以需要先删除这一千万条记录。
多次使用sql语句删除未能成功(数小时执行不完)
……

------解决方案--------------------
1,楼主不妨考虑一下方法;
A,创建一个表结构和你选择的customer一样的表结构,并且分好区,命名为T1
B,采用分区交换的方式:
ALTER TABLE T1 EXCHANGE PARTITION PART_NAME WITH TABLE CUSTOMER INCLUDING INDEXS WTIHOUT VALIDATION ;--后面的2个关键字是验证数据的有效性,如果加上的话则customer对于的数据必须在T1中拥有有效的分区;

备注:分区交换比insert直接拉数据块,且不需要排序!
C,这样的话T1中现在有分区了,然后每个分区都进行删除重复数据!