API:如何在不通过API发送所有数据的情况下,远程检查两个数据集是否相同?

时间:2018-06-20 16:01:27

标签: sql sql-server algorithm synchronization

我正在构建一个API,以允许远程系统同步数据表中的数百万行(单向)。这些系统在每个端运行不同的数据库(我的接收系统是SQL Server,而发送系统是SAP / Hana),因此它们只能通过API进行通信。

仅使用API​​上的方法,如何确定两个系统之间数据行的差异,并确保它们始终同步?

我的一个想法是提供一个ID(主键)列表,然后提供某种“检查”值或LastUpdatedDate,远程系统随后可以使用它们来查找他们需要添加或更新的记录。但是,如果有1000万行以上,是否有什么方法可以避免每次我要同步数据库时都发送所有1000万个键?

我可以复制任何想法来做类似的事情吗?例如,我知道IMAP使用的方法与上述方法类似,但是在处理“数百万”的电子邮件时效果较差。

编辑(其他信息):

  • 在源系统上无法删除任何记录-因此我不需要处理。
  • 每年将有2000万新行,最多约1.5亿。
  • 旧记录有时可能会更新,并且需要触发重新同步。

1 个答案:

答案 0 :(得分:1)

有一个定理,如果不通过导线发送完整的数据,就没有完美的方法。

但是您可以作弊。 rsync实用程序通过散列整个范围并进行比较来解决此问题。如果存在差异,它将分成多个块并重复进行,直到找到要发送的最小差异。之所以如此作弊,是因为不同事物的哈希不能保证是不同的-它们很可能是不同的。

在您的情况下,我建议每行都具有哈希,然后根据原始ID在范围内哈希这些哈希的串联。如果存在没有差异的块,则可以忽略它。如果有差异且很大,则分成k个块(您可以在k上进行实验)并重复。如果它有差异并且少于N行(也有实验),则发送哈希列表,您就知道要比较的行。

为了提高效率,我将像@scsimon建议的那样预先计算每行的哈希,并在(id, hashed)上使用组合索引。这样,所有用于拉回和散列块的查询将只是索引数据结构上的范围查询,甚至不访问大型表。相信我,这应该会带来非常显着的性能差异。