【问题标题】:What is the best way of inserting data into SQL Server in parallel?将数据并行插入 SQL Server 的最佳方法是什么?
【发布时间】:2019-05-28 07:58:34
【问题描述】:

我正在尝试将 MS Access (.mdb) 文件中的数据插入 SQL Server 2014 标准版。每个文件包含 100 个表。我有超过三千个文件要加载到 SQL Server 中。在 100 个表中,一些被加载到一个公用表中,其余的被加载到 SQL Server 中的单个表中。

目前它正在使用 Microsoft Jet.4.0,通过前端循环遍历文件列表,然后遍历表列表。这个过程需要三到四天才能完成,效率不够。

我想最大限度地利用服务器资源,尽量减少运行时间。我的服务器在主动-被动集群环境中有 128GB RAM 和 32 个核心处理器。如何并行或以任何有效的方法插入所有文件?

我尝试过的:

我编写了一个多线程程序来向 SQL Server 发送插入请求,我发现它同时向 SQL Server 发送多个请求,但 SQL Server 正在串行处理这些请求。因此,性能并没有提高。

我尝试了 SQL Server 代理作业,它证明是并行的,但是对我来说似乎很难控制。

如果我们计算,加载一个文件需要 2 分钟,总共有 3000 个文件。所以,六千分钟就是 4.16 天。平均文件大小约为 100 mb。即使在过去几个月的每一天中搜索并测试了我发现的每种方法后,我也没有发现任何可行的方法。

有没有合适的方法来高效插入数据?

【问题讨论】:

  • 你试过DTS吗?这是非常有效的。 Ir 看起来很困难,但使用来自 Enterprise Mánager 的标准导入,然后存储它为您创建 DTS 的步骤。然后你需要为多个文件自定义
  • 如果这是一次性工作,为什么不让它用 4 天时间完成。如果你不能很快找到任何东西,你可能最终会使用比这 4 天更多的时间。
  • 亲爱的 Zach,感谢您对此问题的关注。为了说明,这是一个每月定期的流程。我们在每个月的第一天或第二天收到所有数据文件,需要在 5 号之前完成合并并准备报告以供上级管理,这导致我们考虑到这个问题。
  • 我已使用 CSV 文件中的 SQL Server 批量插入来完成此类任务。明天我在办公室时,我会发布一个示例。您需要先将表格导出为 CSV。批量插入非常快。
  • 加载 100 mb 永远不会需要 2 分钟 - 也许 10 秒!您的服务器设置或编程一定有问题。在可接受的时间内首次加载文件。然后尝试并行工作。

标签: sql sql-server tsql


【解决方案1】:

我将添加一个无益的评论 - 我并不是要刻薄 - 只是来自一位老开发人员的一点历史观点。这是 1980 年代经典的噩梦设计……以及为什么网络的发明如此繁荣。显然,真正的解决方案是使用通用 SQL 后端服务器迁移到 Web 应用程序,而不是尝试将这 1000 个数据集作为批处理来收集……。话虽如此 - 我确实明白有些领域的基础设施不适合网络。

【讨论】:

    【解决方案2】:

    我建议使用 DtsWizard.exe - 它会即时生成一个包,您可以保存并修改它。您可以使用它来熟悉 SSIS 和所有加载选项 - 即。并行加载、快速加载等

    更重要的是 - 我还建议在加载之前 禁用触发器和索引。这可以产生巨大的影响。如果你有 FK 索引,你可以探索让它们保持打开状态——在某些情况下它会有所帮助。

    另一个选项是批量加载 - 您可以使用命令行 - 或 c# SqlBulkCopy 类 - 并相应地设置选项以绕过触发器等。人们提到加载记录应该比您遇到的更快,其中一些小选项会影响性能。

    另外,您是否正在加载 blob? xml?你有xml索引吗?

    【讨论】:

      【解决方案3】:

      因为批量插入作业可以锁定数据库文件,请考虑增加系统 tempdb 数据库和目标数据库的文件数。

      建议使用与 CPU 数量一样多的文件(可用于 SQL Server)-(这不是 SQL2014 上的默认安装选项),多加几个不会有坏处,有时可以降低锁存器,如果您在不同的通道上拥有多个磁盘分区,则更是如此。 然后您可以选择将表存储在一个分区文件上。 我还建议将 Sql Server Agent 与多个作业一起使用,每个作业都有一个简单的批量插入 cmd 行

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 2010-10-16
        • 1970-01-01
        • 2011-08-08
        • 1970-01-01
        相关资源
        最近更新 更多