【问题标题】:What is the proper way to insert millions of records from a csv file into a SQL Server database?将 csv 文件中的数百万条记录插入 SQL Server 数据库的正确方法是什么?
【发布时间】:2016-05-28 10:43:27
【问题描述】:

我必须将.csv 文件中的 4000 万条记录插入数据库,下面是我遵循的过程。

  • Windows 服务 1:

    • 读取 CSV
    • 验证记录
    • 使用SqlBulkCopy将有效记录插入成功表(中间表)。
  • Windows 服务 2。

    • 一次从成功表中获取 10 000 条记录
    • 为这 10 000 人运行一个 foreach
    • 将每条记录发送到数据库以插入到主表中。

Windows 服务 1 大约需要 30-40 分钟,但 Windows 服务 2 大约需要 5 小时才能完成任务(最短时间)。我有 2 种方法可以做到这一点,但无法决定哪种方法更好并欢迎提出建议。

  1. 创建 4 个独立的 windows 服务并同时处理 40000 条记录
  2. 使用工作表,我们可以使用 while 循环
  3. 从 Windows 服务异步调用过程

我最大的疑问是我们在过程中使用事务并且将使用它异步工作,因为根据我的假设使用事务锁定表并且其他进程需要对其进行处理。

【问题讨论】:

  • 百万? SqlBulkCopy 是唯一的一个。 running a foreach 可能是薄弱环节。如果您使用游标,请考虑重写查询,使其基于设置。
  • 我们在 Windows 服务 1 中使用 sqlbulkcopy,但我们在第二个 Windows 服务程序中执行某些验证,因此不能使用批量复制。她的另一件事是,当我们使用批量复制时,我们假设一组 10 万要使用 sql 批量复制一次插入记录,那么即使一条记录失败,我也需要记录此错误,或者至少需要知道哪条记录有此错误,因此使用批量复制是不可能的
  • Bit 如果采用不同的方法,但这对 SSIS 来说没什么可做的吗?集成服务有一个批量插入,您可以在其中进行转换。我非常怀疑在 SSIS 中需要一个多小时
  • 为什么服务2做单独的插入语句,为什么不只是insert into ... select

标签: c# sql-server database csv sqlbulkcopy


【解决方案1】:

我认为您在这项工作中使用了错误的工具。 c# 应用程序可能会做到这一点,但使用集成服务有更强大的方法来做到这一点。

我在这里猜,但是中间的这些表是要转换或检查,或者可能是批量导入?

SSIS 可以使用它的日志限制和 SQL 批量导入工具来完成所有这些事情。我目前正在导入医院数据,每晚大约有 8,000,000 条记录,这需要我几分钟而不是几小时的时间。

关于 SQL 如何处理如此大的数据输入的一个很好的读物是this article

【讨论】:

  • 目前我正在查看 ssis 并且以前从未使用过它,因此任何此类文章都会对我有很大帮助(目前查看 youtube 和 google 搜索结果)。使用中间表是因为我们在链接到另一个表的 csv 文件,我们需要将该主键插入到主表中(就像我们有一个来自 csv 的名称,我们将名称插入到这个中间表中,然后将该用户的主键更新到这个表中并且只在第二个表中插入主键)
  • 啊,是的,我的数据集中也有这个问题。当前,我运行一个 SQL 命令来更改我的目标表,删除了 PK 并将其设置在批处理结束时。我知道这有点冒险,但我在该表上有一个聚集索引,创建另一个会占用计算时间。如果你有复数视力,那里有一些很棒的 SSIS 东西
  • 目前我们的系统上没有安装 SSIS 和复数视力,我们是否有任何其他方法可以做到这一点,因为创建 sql 命令是可以的,但由于它的银行项目不能冒这个风险,因为验证这些帐户是对我来说又是一项艰巨的任务。现在完全迷失了,想写 10 个 Windows 服务任何建议
  • 我建议避免编写服务。考虑它的好方法,如果您已经在数据层,请不要尝试跳出只是重新进入。我强烈建议您安装集成服务。你有理由不能这样做吗?如果您有 SQL 标准,它是免费的,并且与 MSSQL 一起打包。如果你绝对不能使用 SSIS,你可以使用 SQL 批量插入技术和 SQL 代理(这不是一个好的解决方案,这里可能会出错)
猜你喜欢
  • 1970-01-01
  • 2010-09-13
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
  • 2015-09-04
  • 1970-01-01
相关资源
最近更新 更多