通过将两个表导入 sql 数据库或使用 jdbc 来比较两个表是否更快?

Is comparing two tables faster by importing them into a sql database or by using jdbc?

背景

我需要比较 两个不同数据中心 中的两个 table 以确保它们相同。 table 可以是数亿行,甚至是十亿行。

这方面的一个例子是拥有生产数据管道和开发数据管道。我需要验证每个管道末端的 table 是否相同,但是,它们位于不同的数据中心。

如果每行和每列的所有值和数据类型都匹配,则 table 相同。每个 table.

都有主键

这是一个输入和输出示例:

输入

table1:
Name | Age |
Alice| 25.0|
Bob  | 49  |
Jim  | 45  |
Cal  | 52  |

table2:
Name | Age |
Bob  | 49  |
Cal  | 42  |
Alice| 25  |

输出:

table1 missing rows (empty):
Name | Age |
     |     |

table2 missing rows:
Name | Age |
Jim  | 45  |

mismatching rows:
Name | Age | table |
Alice| 25.0| table1|
Alice| 25  | table2|
Cal  | 52  | table1|
Cal  | 42  | table2|

注意:输出不需要完全像上面的格式,但它确实需要包含相同的信息。

问题

将这些 table 导入新的通用 SQL 环境,然后使用 SQL 生成我想要的输出是否更快?

使用 JDBC 之类的东西是否更快,为每个 table 检索所有行,对每个 table 进行排序,然后逐行比较它们以产生我想要的输出?

编辑:

上述解决方案将在托管 table 之一的数据中心执行。在第一个解决方案中,创建新数据库的唯一目的是使用 SQL 比较这些 table,没有其他用途。

更快的解决方案是将两个 table 加载到您的编程语言中的变量(内存),然后将它们与您最喜欢的算法进行比较。

首先将它们复制到一个新的 table 是 read/write 磁盘操作时间的两倍多,尤其是写入操作。

您应该明确地从数据库选项开始。特别是如果数据库与数据库连接 link 您可以轻松设置数据传输。

这样的比较通常会导致两个来源的 full outer join 并且经验告诉我们 DIY 连接 众所周知,性能低于本机数据库实现(您可以例如部署 并行选项 ).

无论如何,您可以尝试实现一些可以进行比较的复杂算法 ,而无需传输整个 table

一个示例基于 Merkle Trees,您首先在它们的位置扫描两个源以识别哪些部分相同(可以忽略),然后仅传输和比较有差异的部分。

因此,如果您希望 table 几乎相同并且具有允许某些层次结构的键,则这种方法可能比蛮力完全比较更好。