现有一个表 table
有两个字段 a,b没有自增主键现在想把 a,b 重复的数据删除,但是保留一条。数据在千万级别,求一个高效的方法去重。
数据库

解决方案 »

  1.   

    1、select distinct a,b into #t from tb
    2、truncate table tb
    3、insert into tb select * from #t
      

  2.   

    With dup as 
    (
    Select *,ROW_NUMBER() Over(Partition by a,b order by a,b)as rn
    From tb
    )
    Delete From Dup
    Where rn = 1
     如果删除的数据量比较少可以用这个。MsSql server2008
      

  3.   

    With dup as 
    (
        Select *,ROW_NUMBER() Over(Partition by a,b order by a,b)as rn
        From tb
    )
    Delete From Dup
    Where rn > 1
    是大于 1 修改一下。
      

  4.   

    -------------如果删除的数据量比较大时
    With dup as 
    (
    Select *,ROW_NUMBER() Over(Partition by a,b order by a,b)as rn
    From dbo.tb
    )
    Select a,b
    Into dbo.duptmp
    From dup
    Where rn = 1;
    ---
    drop table tb;
    exec sp_rename 'dbo.duptmp','dbo.tb'
    当删除的数据比较少时。
      

  5.   


    能不能解说下原理? 新手不大懂
    第一步先把非重复的插入一个临时表(这个临时表就是你希望保留的数据),然后第二步把原表清空了,第三步把数据插回去原表测试小数据没问题,千万级别的数据,表示半小时了还没有搞定,有没有更高效的方法啊?
    我这个方法是当初处理银行数据时候用的,最少300万数据。我运行半小时后提示:SQL Server 数据库引擎的实例此时无法获得 LOCK 资源。请在活动用户较少时重新运行该语句。请询问数据库管理员,检查此实例的锁定和内存配置,或检查是否有长时间运行的事务。
      

  6.   


    能不能解说下原理? 新手不大懂
    第一步先把非重复的插入一个临时表(这个临时表就是你希望保留的数据),然后第二步把原表清空了,第三步把数据插回去原表测试小数据没问题,千万级别的数据,表示半小时了还没有搞定,有没有更高效的方法啊?
    我这个方法是当初处理银行数据时候用的,最少300万数据。我运行半小时后提示:SQL Server 数据库引擎的实例此时无法获得 LOCK 资源。请在活动用户较少时重新运行该语句。请询问数据库管理员,检查此实例的锁定和内存配置,或检查是否有长时间运行的事务。你还有人用这个表是吧?这样的话别的的程序会使得这个表上加锁,如果你这个操作是频繁执行,那么最好分成大概1000行一次地update,如果只需要执行一次,那么用我的方法是可以的,不过可以修改一下第一步:select distinct a,b into #t from tb with(nolock)