通过将两个表导入 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 几乎相同并且具有允许某些层次结构的键,则这种方法可能比蛮力完全比较更好。
背景
我需要比较 两个不同数据中心 中的两个 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 几乎相同并且具有允许某些层次结构的键,则这种方法可能比蛮力完全比较更好。