【问题标题】:Fastest way for inserting very large number of records into a Table in SQL在 SQL 中将大量记录插入表中的最快方法
【发布时间】:2011-02-15 12:00:07
【问题描述】:

问题是,我们有大量记录(超过一百万)要从 Java 应用程序插入到单个表中。记录是由 Java 代码创建的,它不是从另一个表移动的,所以 INSERT/SELECT 没有帮助。

目前,我的瓶颈是 INSERT 语句。我正在使用 PreparedStatement 来加快进程,但在普通服务器上每秒无法获得超过 50 条记录。这张表一点也不复杂,上面也没有定义任何索引。

这个过程耗时太长,时间长了就会出问题。

如何才能获得最大速度(每秒插入)?

数据库:MS SQL 2008。应用程序:基于 Java,使用 Microsoft JDBC 驱动程序。

【问题讨论】:

    标签: java sql-server performance large-data-volumes


    【解决方案1】:

    批量插入。也就是说,一次只发送 1000 行,而不是一次发送一行,因此您大大减少了往返/服务器调用

    Performing Batch Operations 在 MSDN 上用于 JDBC 驱动程序。这是最简单的方法,无需重新设计即可使用真正的批量方法。

    每个插入都必须经过解析、编译和执行。批处理将意味着更少的解析/编译,因为一次将编译 1000 个(例如)插入

    有更好的方法,但如果您仅限于生成的 INSERT,则此方法有效

    【讨论】:

    • 我认为往返只是延迟的很小一部分,因为每秒有 50 个事务,每个查询运行需要 20 毫秒。往返时间小于 1ms。我已经做了其他优化来消除往返,但它们并没有太大帮助。除非批处理 INSERT 会导致大部分 SQL 内部处理更有效。是吗?
    • @Irchi:每个插入都必须经过解析、编译和执行。批处理将意味着更少的解析/编译,因为一次将编译 1000 个(例如)插入
    • @Irchi:我之前会尝试这样做,以便将代码重新设计为我们的 BCP 方法
    • 这样更有效的一个原因是mysql查询解析器不必解析每个查询。我在 Java 中更改了一段代码(与集群 mysql 对话)以使用 1000 的批量插入,速度提高了 100 倍(10000%)
    • 我一直在测试这个,并注意到如果我设置 conn.setAutoCommit(false); 性能会从 25 行/秒变为 107 行/秒;这似乎是一个必不可少的设置,在 MSDN 链接中没有提到...
    【解决方案2】:

    使用BULK INSERT - 它专为满足您的要求而设计,显着提高了插入速度。

    另外,(以防万一您确实没有索引)您可能还需要考虑添加索引 - 一些索引(大多数是主键上的索引)可能会提高插入。

    您应该能够插入记录的实际速率将取决于确切的数据、表结构以及 SQL 服务器本身的硬件/配置,因此我无法真正给您任何数字。

    【讨论】:

    • 其实我的PK上有一个索引是聚集的,数据是按PK顺序插入的,所以我觉得不会有什么影响。我将尝试 BULK INSERT,我想这是我的解决方案。
    【解决方案3】:

    您是否调查过批量操作bulk operations

    【讨论】:

    • 我会试试的,我想这将是我最好的解决方案。唯一的问题是我必须创建文件然后运行操作,而且我必须针对文件存储和网络条件可能发生的不同场景编写代码。
    【解决方案4】:

    你考虑过使用batch updates吗?

    【讨论】:

    • 谢谢,我想这也很有帮助。但我会先尝试 BULK INSERT,看起来更有希望!
    【解决方案5】:

    表上是否有任何完整性约束或触发器? 如果是这样,在插入之前将其丢弃会有所帮助,但您必须确保您能够承受后果。

    【讨论】:

    • 有两个 FK 约束,我打算删除它们并尝试一下。但是 BULK INSERT 可以选择忽略约束,所以我想使用 BULK INSERT 我将拥有我需要的所有优势。
    【解决方案6】:

    查看Sql Server's bcp utility.

    这意味着您的方法将发生重大变化,您将生成一个分隔文件并使用外部实用程序导入数据。但这是将大量记录插入 Sql Server 数据库的最快方法,并且会加快您的加载时间多个数量级。

    另外,这是您必须执行的一次性操作还是会定期执行的操作?如果是一次,我建议您甚至不要编写此过程,而是使用 db 实用程序的组合执行导出/导入。

    【讨论】:

      【解决方案7】:

      我建议使用 ETL 引擎。您可以使用Pentaho。免费。 ETL 引擎针对数据的批量加载以及所需的任何形式的转换/验证进行了优化。

      【讨论】:

        猜你喜欢
        • 2011-06-03
        • 2016-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多