【问题标题】:Best way to find/update duplicate people in SQL Server在 SQL Server 中查找/更新重复人员的最佳方法
【发布时间】:2019-12-19 02:57:39
【问题描述】:

我有一个从多个供应商导入包含“人员”信息的 CSV 文件的过程。该过程必须从 CSV 中读取人员,并决定是否需要在数据库中插入或更新人员。

一个人实际上可以存在于不同供应商的 CSV 中——所以我不能只通过 ID 查找每个人(每个供应商的“人”都有不同的 ID)。因此,我必须通过查看以下内容来确定此人是否是数据库新手:

  1. 供应商 ID + VendorAssignedID(即正在处理的供应商 ID 及其唯一的个人 ID)
  2. 社会保障号
  3. 名字 + 姓氏 + 生日

如果找到匹配项,我需要使用供应商 CSV 中的任何更改信息更新此人。如果未找到匹配项,则需要插入此人。

每个 CSV 最多可包含 1000 人。必须对照数据库检查每个人,以查看他们是否需要插入或更新。如果数据库包含 10,000 多人,无论有没有 EF Core,这似乎都会非常缓慢(每个 CSV 可能有 10,000,000 次读取)。

我目前在项目中使用 EF Core,但在这个特定领域,似乎 EF Core 无法胜任这项任务。

我很好奇其他人是如何解决此类问题的?执行此类操作的最快选择是什么 - 一系列 MERGE 语句,使用 EF Core 调用的存储过程?

其他信息

根据一些答案,我想我会添加以下内容。

首先,CSV 文件采用不同的格式——不同的列名、不同的值类型(例如,一个供应商可能使用数字来标识性别,而另一个供应商可能使用字母)。

CSV 文件正在通过 .Net Core Web API 上传到服务器。 Controller/Action 解析 CSV 文件,将值转换为通用格式并创建一个包含数据的 Person 对象列表。

所以,实际上,比较的是每个Person 对象中的数据和数据库中的数据。

【问题讨论】:

  • 你在这里有点像掉进了兔子洞。我在一家公司工作了 15 年,他们最初弄错了我的出生日期。几年后,我意识到并进行了更新。所以他们把它改成了另一个错误的日期。在某些但不是所有系统中。那些被传播给供应商。我的 DOB 现在是垃圾数据。而且,Falsehoods Programmers Believe About Names 还谈到了更多的死胡同。只是,知道你在这里要做什么。
  • 相信我,我知道与尝试匹配人相关的陷阱——即使 SSN 也不是万无一失的。但是,有时您需要满足于不是最优的解决方案。
  • 公平声明。 FWIW,因为会有几个字符串比较,无论你使用什么都会很慢。
  • 同意!我可能应该在上面说明它,但我不认为会有任何“极快”的解决方案 - 我试图找到的是我的慢速选项中最快的。 :-)
  • P.S.我是开发人员,而不是 DBA,所以我绝不是 SQL 专家。可以从那些熟悉 SQL 的人那里获得一些指导,我的选择是什么

标签: sql-server entity-framework


【解决方案1】:

我会假设您的 CSV 是固定且已知的格式,因为它会使事情变得更容易一些。

我会考虑分阶段进行导入:

  1. 您将所有 CSV 行解析并提取到一个 tblCsvImport 中,除了 CSV 文件名 (id?) 和您当时可以确定的任何内容之外,它没有太多限制。所有列都可以为空,并且尚未完成匹配。
  2. 您运行一个存储过程,它会根据您的规则执行 MERGE,并在完成后可选择清除表

如果您的 CSV 格式有点灵活,您可能需要做更多的工作,因为您必须存储原始行并在存储的过程中解析它们。根据您的复杂性,摄取表行上的游标可能更容易实现(尽管请记住,SQL Server 中的游标会因性能不佳而有点污名)

【讨论】:

    【解决方案2】:

    如果可以的话,这可能是最好的选择:

    1. 将 csv 文件的bulk insert 放入新表(或现有表,如果架构没有更改,如果您保留该表,则第一步需要截断)
    2. 写一个merge statement 做必要的插入/更新(如果需要,删除)
    3. 从步骤 1 中删除(或截断)表格

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 2016-03-16
      • 1970-01-01
      • 2019-11-22
      • 2017-12-05
      相关资源
      最近更新 更多