计算具有多列的行的哈希或校验和的最有效方法



我有一个场景,需要检查目标数据库中的行是否需要从源数据库更新。源数据实际上是一个视图,来自该视图的数据被泵送到目标表中。因为源视图从几个底层表中收集/汇总/枢轴数据,所以我们并没有一个好的方法来更改模式以支持更改跟踪,所以我的想法是计算每行数据的哈希,并将其作为视图的一部分。然后,我们可以比较目标表中的哈希值,看看是否存在差异,并相应地进行更新。

我知道:

CHECKSUM
BINARY_CHECKSUM
HASHYBYTES

功能。CHECKSUM()或BINARY_CHECKSUM。我也知道,即使在编辑之后,生成的校验和/哈希也可能没有什么不同,但在这种情况下这是可以容忍的。

那么问题来了:散列/校验和方法是实现这一点的好方法吗?如果是,最好使用什么函数?还是有其他更好的方法来完全解决这个问题?

(哦,现在在SQLServer2005上运行,但如果有帮助的话,我们很快就会转到2008R2。)

我真的不知道我会信任CHECKSUM。我见过很多案例,人们记录了两个不同的行产生碰撞的情况。你只是想知道一行已经更改(或者在目的地中还不存在)吗?你放弃使用ROWVERSION的可能性了吗?您是否有可能同时更新两地的数据?

由于您即将迁移到SQL Server 2008 R2,您是否考虑过其他已经存在的方法,如更改跟踪或更改数据捕获?(此处进行比较。)还有其他方法可以解决这个问题,不需要关心哪些行发生了变化,但这取决于您的最终目标。在我使用的一个旧系统中,我们会将主要数据更改集中到一个单独的模式中,然后在数据到达时进行切换。当然,所有的数据都在源中更新了,目的地落后几分钟也是可以的。但它避免了计算源和目的地之间的delta的麻烦。

最新更新