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

时间:2012-03-06 22:43:33

标签: sql-server sql-server-2005 sql-server-2008-r2

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

我知道:

CHECKSUM
BINARY_CHECKSUM
HASHYBYTES

功能。 CHECKSUM()或BINARY_CHECKSUM()似乎是最好的选择,但我不确定它对50列和100万行的视图的性能如何。我也知道即使在编辑之后生成的校验和/哈希也可能没有差别,但在这种情况下这是可以容忍的。

所以问题:哈希/校验和是否是一种很好的方法,如果是这样,最好的函数是什么?或者还有另一种更好的方法可以解决问题吗?

(哦,现在在SQL Server 2005上运行,但如果有帮助,我们很快就会转向2008R2。)

1 个答案:

答案 0 :(得分:2)

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

由于您即将迁移到SQL Server 2008 R2,您是否考虑过已存在的其他方法,例如Change TrackingChange Data Capture? (Comparison here。)还有其他解决此问题的方法,不涉及关注哪些行已更改,但这取决于您的最终目标。在我使用过的旧系统中,我们会将主要数据更改集中到一个单独的模式中,然后在数据到达时播放切换器。当然所有数据都在源代码中更新,目的地可以在几分钟后完成。但它避免了在源和目的地之间计算增量的麻烦。