通过将两个表导入sql数据库或使用jdbc,比较它们是否更快? 背景
我需要比较两个不同数据中心中的两个表,以确保它们是相同的。这些表格可能有数亿条,甚至10亿行 例如,生产数据管道和开发数据管道。我需要验证每个管道末端的表是否相同,但是,它们位于不同的数据中心 如果每行和每列的所有值和数据类型都匹配,则表是相同的。每个表都有主键 下面是一个输入和输出示例: 输入 输出:通过将两个表导入sql数据库或使用jdbc,比较它们是否更快? 背景,sql,database,jdbc,diff,system-design,Sql,Database,Jdbc,Diff,System Design,我需要比较两个不同数据中心中的两个表,以确保它们是相同的。这些表格可能有数亿条,甚至10亿行 例如,生产数据管道和开发数据管道。我需要验证每个管道末端的表是否相同,但是,它们位于不同的数据中心 如果每行和每列的所有值和数据类型都匹配,则表是相同的。每个表都有主键 下面是一个输入和输出示例: 输入 输出: table1 missing rows (empty): Name | Age | | | table2 missing rows: Name | Age | Jim |
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|
注意:输出不需要与上述格式完全相同,但需要包含相同的信息
问题:
将这些表导入到新的公共SQL环境中,然后使用SQL生成所需的输出是否更快
或
使用JDBC之类的东西,检索每个表的所有行,对每个表进行排序,然后逐行比较以生成所需的输出,是否更快
编辑:
上述解决方案将在承载其中一个表的数据中心执行。在第一种解决方案中,创建新数据库的唯一目的是使用SQL比较这些表,没有其他用途。更快的解决方案是将两个表加载到编程语言中的变量(内存)中,然后与您喜欢的算法进行比较
首先将它们复制到新表是磁盘读/写操作时间的两倍以上,尤其是写操作。您应该从数据库选项开始。特别是如果数据库通过数据库链接连接,则可以轻松设置数据传输 这样的比较通常会导致两个源的
完全外部连接
,经验告诉我们,DIY连接的性能明显低于本机数据库实现(例如,您可以部署并行选项)
无论如何,您可以尝试实现一些模拟算法,这样就可以进行比较,而无需传输整个表
例如,首先扫描两个源的位置,以识别哪些部分相同(可以忽略),然后仅传输和比较有差异的一方
因此,如果您希望表几乎相同,并且具有允许某种层次结构的键,那么这种方法可能比暴力完全比较更好。您确实需要在您的环境中对数据进行测试。您需要定义“比较”的含义(例如,“1.00”是否与“1”相同?)。数据库还有其他用途吗?它在一个更强大的服务器上吗?我现在正在编辑这个问题。感谢您的输入,您将不得不进行艰苦的编码以击败数据库查询(例如,使用并行选项),并且不要忘记表不需要与您的内存匹配,因此您应该更加小心声明。
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|