11

问题是,我们有大量记录(超过一百万)要从 Java 应用程序插入到单个表中。记录是由 Java 代码创建的,它不是从另一个表移动的,因此 INSERT/SELECT 将无济于事。

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

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

我该怎么做才能获得最大速度(每秒插入)?

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

4

7 回答 7

10

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

在 MSDN 上为 JDBC 驱动程序执行批处理操作。这是最简单的方法,无需重新设计即可使用真正的批量方法。

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

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

于 2010-05-04T14:19:02.983 回答
6

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

Also, (just in case you really do have no indexes) you may also want to consider adding an indexes - some indexes (most an index one on the primary key) may improve the performance of inserts.

The actual rate at which you should be able to insert records will depend on the exact data, the table structure and also on the hardware / configuration of the SQL server itself, so I can't really give you any numbers.

于 2010-05-04T14:37:34.957 回答
2

您是否研究过批量操作批量操作

于 2010-05-04T14:18:43.243 回答
1

您是否考虑过使用批量更新

于 2010-05-04T14:23:56.277 回答
1

Is there any integrity constraint or trigger on the table ? If so, droping it before inserts will help, but you have to be sure that you can afford the consequences.

于 2010-05-04T15:31:03.580 回答
0

查看Sql Server 的 bcp 实用程序。

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

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

于 2010-05-04T14:23:51.047 回答
0

I would recommend using an ETL engine for it. You can use Pentaho. It's free. The ETL engines are optimized for doing bulk loading on data and also any forms of transformation/validation that are required.

于 2010-05-04T14:47:44.320 回答