我有一个大型数据集(约1500万条记录),每月更新一次,并通过CSV文件导出。我需要将这些数据匹配并合并到一个大致相同数量的实体的数据库中。关于什么是匹配记录的数据源的业务规则与我的不同;因此,源文件中可能存在匹配的记录(根据我的规则)。
我遇到的问题是,匹配的记录通常会在CSV文件中逐行显示。对于自上次导入以来的任何新数据,除非我在每一行之后提交,否则对数据库进行匹配检查将不会返回任何内容,直到下一次提交,此时该提交中的所有记录(包括那些应该与其他记录匹配的东西将被保留。
例如,如果我的提交间隔为50,并且在提交之间读取了30条匹配的行,那么这30条记录将被保留而不是一条合并记录。
我已尝试在每个源记录之后进行提交,但由于显而易见的原因,这大大减慢了导入速度。考虑到数据集的大小,即使是小的性能命中也会对整体运行时间产生很大影响。
我唯一能想到的就是跟踪未提交的记录并匹配它们以及数据库中的内容。我使用Spring Data JPA进行持久化(由Hibernate支持)和Spring Batch进行导入,如果这有所不同。
我觉得我可能会遗漏一些东西,而且我确定我不是第一个解决这个问题的人。提前感谢任何建议。
答案 0 :(得分:0)
如何使用Java将csv文件加载到临时表中。触发存储过程以仅将必要的行从登台表移动到生产表。完成后,存储过程将清理(截断)登台表。
答案 1 :(得分:0)
如果您的数据库支持,您可以使用SQL MERGE
命令。这样,您可以将匹配的行问题委托给数据库引擎。
MERGE INTO tablename USING table_reference ON (condition)
WHEN MATCHED THEN
UPDATE SET column1 = value1 [, column2 = value2 ...]
WHEN NOT MATCHED THEN
INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...