我有一个从几个供应商处导入包含“人”信息的CSV文件的过程。该过程必须从CSV中读取人员,并确定是否需要在数据库中插入或更新人员。
一个人实际上可以存在于不同供应商的CSV中-因此,我不能只是通过ID查找每个人(每个供应商的“人员”都有不同的ID)。因此,我必须通过查看以下内容来确定此人是否是数据库新手:
如果找到匹配项,我需要使用供应商CSV中任何已更改的信息来更新此人。如果找不到匹配项,则需要插入此人。
每个CSV可能包含多达1000个人。必须对照数据库检查每个人,看看是否需要插入或更新他们。如果数据库包含10,000多个人员,则无论有没有EF Core(似乎每个CSV可能读取10,000,000次读取),这似乎都会非常缓慢。
我目前在项目中使用EF Core,但在这个特定领域,似乎EF Core似乎并不能胜任这项任务。
我很好奇其他人如何解决此类问题?做这样的事情,我最快的选择是什么?一系列MERGE
语句,用EF Core调用的存储过程?
其他信息
根据一些答案,我想添加以下内容。
首先,CSV文件具有不同的格式-不同的列名,不同的值类型(现在,一个供应商可能使用数字标识性别,而另一个供应商可能使用字母)。
正在通过.Net Core Web API将CSV文件上传到服务器。 Controller / Action解析CSV文件,将值转换为通用格式,并创建包含数据的Person
对象的列表。
因此,实际上,比较是每个Person
对象中的数据与数据库中的数据之间的比较。
答案 0 :(得分:0)
我将假定您的CSV是固定的且已知的格式,因为它将使事情变得容易一些。
我将分阶段进行导入:
tblCsvImport
中,除了CSV文件名(id?)以及当时可以确定的任何内容外,没有太多限制。所有列都可以为空,并且尚未完成匹配。MERGE
,并在完成后有选择地清除表如果您的CSV格式比较灵活,则您可能需要做更多工作,因为您必须存储原始行并将其解析到存储的proc中。根据您的复杂性,在获取表行上的游标可能更易于实现(尽管请记住,SQL Server中的游标带有一些污名,以降低性能)
答案 1 :(得分:0)
如果有可能,这可能是效果最好的选项: