sql - API:如何远程检查两个数据集是否相同,而不通过 API 发送所有数据?
问题描述
我正在构建一个 API 以允许远程系统同步数据表中的数百万行(单向)。系统在每一端运行不同的数据库(我的接收系统是 SQL Server,但发送系统是 SAP/Hana),因此它们只能通过 API 进行通信。
仅使用 API 上的方法,我如何确定两个系统之间数据行的差异并确保它们始终同步?
我的一个想法是提供一个 ID 列表(主键),然后是某种“检查”值或 LastUpdatedDate,然后远程系统可以使用它来找出他们需要添加或更新哪些记录。但是,如果有 1000 万行+,有没有办法避免每次我想同步数据库时发送所有 1000 万个键?
有没有我可以复制想法的协议来做类似的事情?例如,我知道 IMAP 使用与上述类似的方法,但在处理“数百万”电子邮件方面表现不佳。
编辑(附加信息):
- 在源系统上不能删除任何记录 - 所以我不需要处理。
- 每年将有 2000 万个新行,最多约为 1.5 亿行。
- 旧记录偶尔会更新,需要触发重新同步。
解决方案
有一个定理,如果不通过网络发送完整数据,就没有完美的方法来做到这一点。
但是你可以作弊。rsync实用程序通过散列整个范围和比较来解决这个问题。如果有差异,它会分成块并重复,直到找到要发送的最小差异。这是作弊的原因是不同事物的哈希值不能保证是不同的——它们只是可能不同。
在您的情况下,我建议对每一行进行哈希处理,然后根据原始 ID 在范围内对这些哈希的串联进行哈希处理。如果有没有差异的块,您可以忽略它。如果它有差异并且很大,则分成k
块(您可以尝试k
)并重复。如果它有差异并且少于N
行(也对此进行实验),则发送散列列表,您就知道要比较哪些行。
为了提高效率,我会像@scsimon 建议的那样预先计算每行的哈希值,并在(id, hashed)
. 这样,所有要拉回和散列块的查询都将只是对索引数据结构的范围查询,甚至不会访问大表。相信我,这应该会产生非常显着的性能差异。
推荐阅读
- python - openCL cv2.UMat 对象不可迭代
- excel - 所有日期变量的 IF 逻辑为空
- c++ - 从 Linux OMI (omicli) 到 Windows WMI 的连接失败并出现 DMTF 相关错误
- javascript - 解析嵌套的 javascript 对象
- serial-port - RS232 上的 DTR/RTS 可以用作 GPIO 来打开/关闭传感器吗?协议是否允许这种配置?
- logging - 在 IDE 中运行时的 Logback 配置
- git - 忽略已经提交给 git 的文件
- spring - 项目构建错误:io.zipkin.java:zipkin-autoconfigure-ui:jar 的“dependencies.dependency.version”缺失
- android - Android Studio 是否提供了一种测试设备之间交互的方法?
- python - 如何解决excel行列难?