首页 > 解决方案 > API:如何远程检查两个数据集是否相同,而不通过 API 发送所有数据?

问题描述

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

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

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

有没有我可以复制想法的协议来做类似的事情?例如,我知道 IMAP 使用与上述类似的方法,但在处理“数百万”电子邮件方面表现不佳。

编辑(附加信息):

标签: sqlsql-serveralgorithmsynchronization

解决方案


有一个定理,如果不通过网络发送完整数据,就没有完美的方法来做到这一点。

但是你可以作弊。rsync实用程序通过散列整个范围和比较来解决这个问题。如果有差异,它会分成块并重复,直到找到要发送的最小差异。这是作弊的原因是不同事物的哈希值不能保证是不同的——它们只是可能不同。

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

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


推荐阅读