zoukankan      html  css  js  c++  java
  • tableDiff的原理测试

        看了一下tablediff的比较,网上有些文章说NULL不能比较,但是同步测试了SQL 2008 的功能,发现其实能够比较出NULL值的。

    运行tablediff命令:SQL Profiler 跟踪出以下sql:  

    SELECT  [dbo].[Tmp].[ID],
            BINARY_CHECKSUM([dbo].[Tmp].[Account][dbo].[Tmp].[CharName],
                            [dbo].[Tmp].[ID]as MShash_54267293
    FROM    [dbo].[Tmp] WITH ( READUNCOMMITTED )
    ORDER BY [dbo].[Tmp].[ID]


    SELECT  [dbo].[Tmp_Check].[ID],
            BINARY_CHECKSUM([dbo].[Tmp_Check].[Account],
                            [dbo].[Tmp_Check].[CharName][dbo].[Tmp_Check].[ID]as MShash_54267293
    FROM    [dbo].[Tmp_Check] WITH ( READUNCOMMITTED )
    ORDER BY [dbo].[Tmp_Check].[ID]
     

       判断表中某一行的不同,使用了BINARY_CHECKSUM函数       

         按照表的某一行或表达式列表计算的二进制校验和值。BINARY_CHECKSUM 可用于检测表中行的更改
         指定对表中的所有列进行计算。BINARY_CHECKSUM 在计算中忽略具有不可比数据类型的列。不可比数据类型包括 textntextimagecursorxml 和不可比公共语言运行库 (CLR) 用户定义的类型。

        如果发现目标库没有: 

    SELECT [dbo].[Tmp].[Account],[dbo].[Tmp].[CharName],[dbo].[Tmp].[ID] FROM [dbo].[Tmp] WITH (READUNCOMMITTED) WHERE [ID] = 1

        执行上面语句生成 insert语句。是一条一条生成。

      如果目标库有不一样的

     SELECT [dbo].[Tmp_Check].[Account],[dbo].[Tmp_Check].[CharName],[dbo].[Tmp_Check].[ID] FROM [dbo].[Tmp_Check] WITH (READUNCOMMITTED) WHERE [ID] = 4

       目标库也会执行上面的查询得出哪个列不一样和生成更新sql

       以上如果在SQL 2008 中执行tablediff生成大量数据会很慢,同时也会造成内存溢出。

      总结(适用于SQL 2008 SP3):

         1,tablediff 会忽略不可比较的字段

         2,NULL也会比较出来

         3,比较是先全部查询出数据,再把不同的行查出具体数据生成insert,update,delete 语句

         4,数据量大时性能影响很大

  • 相关阅读:
    网站色彩搭配
    web前端小知识,安书整理的
    java基础
    简单android UI必会
    java学习总结
    java字符常量与字符串常量的区别
    最近的学习
    简单的ps操作
    HTTP协议概述
    ABP 学习 Setting
  • 原文地址:https://www.cnblogs.com/zping/p/2636754.html
Copyright © 2011-2022 走看看