zoukankan      html  css  js  c++  java
  • SQL删除重复数据的五种方式

    数据量2000,其中有1000重复

     -------------------------------------------------------------------------------------

     

     --方法一,IN方式,适合2000/2005/2008,6728 毫秒

     DELETE [student_L]

     WHERE  id NOT IN ( SELECT  MAX(id)--min(id)

                        FROM    [student_L]

                        GROUP BY [stuid], [stuname], [Birthday], [AreaOrganID] ) 

                        

                        

    /*

         SQL Server 分析和编译时间

       CPU 时间= 20 毫秒,占用时间= 20 毫秒。

    'student_L'。扫描计数2001,逻辑读取30014 次,物理读取次,预读次,lob 逻辑读取次,lob 物理读取次,lob 预读次。

    'Worktable'。扫描计数1,逻辑读取2020 次,物理读取次,预读次,lob 逻辑读取次,lob 物理读取次,lob 预读次。

     

     SQL Server 执行时间:

       CPU 时间= 6719 毫秒,占用时间= 6728 毫秒。

     

    (1000 行受影响)

    */

                       

     --方法二,CTE方式,适合2005/2008,30 毫秒

     ;

     WITH   dstudent

              AS (

                   SELECT   id,

                            ROW_NUMBER() OVER ( PARTITION BY [stuid], [stuname],

                                                [Birthday], [AreaOrganID] ORDER BY GETDATE() ) pid

                   FROM     [student_L]

                 )

        DELETE  dstudent

        WHERE   id NOT IN ( SELECT  id

                            FROM    dstudent

                            WHERE   pid = 1 )

     

     /*

     SQL Server 分析和编译时间

       CPU 时间= 12 毫秒,占用时间= 12 毫秒。

    'student_L'。扫描计数4,逻辑读取2056 次,物理读取次,预读次,lob 逻辑读取次,lob 物理读取次,lob 预读次。

    'Worktable'。扫描计数1,逻辑读取2020 次,物理读取次,预读次,lob 逻辑读取次,lob 物理读取次,lob 预读次。

     

     SQL Server 执行时间:

       CPU 时间= 32 毫秒,占用时间= 30 毫秒。

     

    (1000 行受影响)

     */

      

       

     --方法三, LEFT JOIN方式,适合2000/2005/2008,7379 毫秒    

     DELETE stu

     FROM   [student_L] stu

     LEFT JOIN (

                 SELECT ID = MAX(id)

                 FROM   [student_L]

                 GROUP BY [stuid], [stuname], [Birthday], [AreaOrganID]

               ) S ON stu.id = s.id

     WHERE  s.id IS NULL 

                     

     /*

     SQL Server 分析和编译时间

       CPU 时间= 10 毫秒,占用时间= 10 毫秒。

    'student_L'。扫描计数2001,逻辑读取30014 次,物理读取次,预读次,lob 逻辑读取次,lob 物理读取次,lob 预读次。

    'Worktable'。扫描计数0,逻辑读取次,物理读取次,预读次,lob 逻辑读取次,lob 物理读取次,lob 预读次。

     

     SQL Server 执行时间:

       CPU 时间= 7375 毫秒,占用时间= 7379 毫秒。

     

    (1000 行受影响)

     

     */   

         

      --方法四,游标方式适合2000/2005/2008,833毫秒

      

     DECLARE @d DATETIME

     SET @d = GETDATE()

      

      --Script.Start

       ---------------------------------------------------------------------------------------------

     DECLARE @id INT 

     DECLARE @stuid INT 

     DECLARE @stuname VARCHAR(50) 

     DECLARE @Birthday VARCHAR(10) 

     DECLARE @AreaOrganID INT  

     DECLARE @prestuid INT 

     DECLARE @prestuname VARCHAR(50) 

     DECLARE @preBirthday VARCHAR(10) 

     DECLARE @preAreaOrganID INT

     

     DECLARE cur CURSOR

     FOR

        SELECT  ID, [stuid], [stuname], [Birthday], [AreaOrganID]

        FROM    [student_L]

        ORDER BY [stuid], [stuname], [Birthday], [AreaOrganID]

     

         

     OPEN cur 

     FETCH NEXT FROM cur INTO @id, @stuid, @stuname, @Birthday, @AreaOrganID 

     

     WHILE @@FETCH_STATUS = 0 

        BEGIN 

        

            IF ( @stuid = @prestuid )

                AND ( @stuname = @prestuname )

                AND ( @Birthday = @preBirthday )

                AND ( @AreaOrganID = @preAreaOrganID ) 

                BEGIN 

                    DELETE  [student_L]

                    WHERE   id = @id 

                END  

               

            SELECT  @prestuid = @stuid, @prestuname = @stuname,

                    @preBirthday = @Birthday, @preAreaOrganID = @AreaOrganID  

                     

            FETCH NEXT FROM cur INTO @id, @stuid, @stuname, @Birthday,

                @AreaOrganID 

        END 

     

     CLOSE cur 

     DEALLOCATE cur 

      

      ---------------------------------------------------------------------------------------------

      --Script.End

     PRINT DATEDIFF(ms, @d, GETDATE())  

     

                   

                   

                   

     --方法五,中间表方式适合/2005/2008 ,39 毫秒。

        

     

     SELECT (

              SELECT TOP 1

                        id

              FROM      student_l a

              WHERE     1 = 1

                        AND a.stuid = b.stuid

                        AND a.[stuname] = b.[stuname]

                        AND a.[Birthday] = b.[Birthday]

                        AND a.[AreaOrganID] = b.[AreaOrganID]

            ) id, [stuid], [stuname], [Birthday], [AreaOrganID]

     INTO   student_l1

     FROM   student_l b

     DROP TABLE student_l

                

     

     EXEC sp_rename 'dbo.student_l1', 'student_l';

     /*

     

    SQL Server 分析和编译时间

       CPU 时间= 0 毫秒,占用时间= 3 毫秒。

    'Worktable'。扫描计数2000,逻辑读取8067 次,物理读取次,预读次,lob 逻辑读取次,lob 物理读取次,lob 预读次。

    'student_l'。扫描计数2,逻辑读取22 次,物理读取次,预读次,lob 逻辑读取次,lob 物理读取次,lob 预读次。

     

     SQL Server 执行时间:

       CPU 时间= 31 毫秒,占用时间= 39 毫秒。

     

    (2000 行受影响)

     */

     

  • 相关阅读:
    Vimium -为键盘而生
    Sublime Text 3 修改配色主题【侧边框之...】
    MyBatis-Plus文档地址
    解决:电脑新建文件后需要刷新才显示
    技术书籍博客
    js获取浏览器当前窗口的高度长度
    DataGridView隐藏列用CSS实现
    判断windows操作系统平台
    iis7.5错误 配置错误
    vmware安装mac
  • 原文地址:https://www.cnblogs.com/qanholas/p/2574848.html
Copyright © 2011-2022 走看看