tableDiff的原理测试

本文探讨了SQL Server 2008 SP3中tablediff工具的工作原理及注意事项,详细介绍了如何通过BINARY_CHECKSUM函数来比较表中行的变化,并讨论了在处理大量数据时可能遇到的性能问题。

    看了一下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,数据量大时性能影响很大

 

 

转载于:https://www.cnblogs.com/zping/archive/2012/08/13/2636754.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值