分享一切

OK...

删除千万级表中重复记录的办法

于前期的问题,在历史交易表中出现了部分重复交易,现在需要整理该表。   
   我一开始打算建一个临时表,用sqlserver    odbc    导入导出数据的办法使用select    distinct    *    的语句将数据导入临时表,修改临时表名的办法,在实际操作过程中发现通过语句操作实际上需要将表中的记录先做select    然后写入临时表中,考虑到记录数和机器性能的问题,这种做法可行性不高。   
   交易表的基本情况是这样的:   
   每条记录约有60个字段,长度超过1k,   
   总共记录1000w,重复记录约在5000-10000   

 

1.    选择候选键,60个字段,应该只用其中几个就可以判断重复了吧。   
   在候选键的这些字段上建立索引。   
   2.     
   CREATE    TRIGGER    tr_历史交易表   
   ON    历史交易表   
   FOR    DELETE     
   AS     
   INSERT    INTO    历史交易表   
   SELECT    DISTINCT    *    FROM    deleted   
   GO     
    
   DELETE    历史交易表   
   FROM    (   
   SELECT    候选键1,    候选键2,    候选键3   
   FROM    历史交易表   
   GROUP    BY    候选键1,    候选键2,    候选键3   
   HAVING    COUNT(*)    >    1   
   )    t   
   INNER    JOIN    历史交易表    a     
   ON    t.候选键1    =    a.候选键1     
   AND    t.候选键2    =    a.候选键2     
   AND    t.候选键3    =    a.候选键3

 

2.还可以是这样:   
   SELECT    DISTINCT    a.*   
   INTO    #T   
   FROM    (   
   SELECT    候选键1,    候选键2,    候选键3   
   FROM    历史交易表   
   GROUP    BY    候选键1,    候选键2,    候选键3   
   HAVING    COUNT(*)    >    1   
   )    t   
   INNER    JOIN    历史交易表    a     
   ON    t.候选键1    =    a.候选键1     
   AND    t.候选键2    =    a.候选键2     
   AND    t.候选键3    =    a.候选键3   
    
   DELETE    历史交易表   
   FROM    (   
   SELECT    候选键1,    候选键2,    候选键3   
   FROM    历史交易表   
   GROUP    BY    候选键1,    候选键2,    候选键3   
   HAVING    COUNT(*)    >    1   
   )    t   
   INNER    JOIN    历史交易表    a     
   ON    t.候选键1    =    a.候选键1     
   AND    t.候选键2    =    a.候选键2     
   AND    t.候选键3    =    a.候选键3   
    
   INSERT    INTO    历史交易表   
   SELECT    *    FROM    #T   

posted on 2008-10-18 02:25  小伟999  阅读(231)  评论(0编辑  收藏  举报

导航